frunk_core::generic

Trait Generic

Source
pub trait Generic {
    type Repr;

    // Required methods
    fn into(self) -> Self::Repr;
    fn from(repr: Self::Repr) -> Self;

    // Provided methods
    fn convert_from<Src>(src: Src) -> Self
       where Self: Sized,
             Src: Generic<Repr = Self::Repr> { ... }
    fn map_repr<Mapper>(self, mapper: Mapper) -> Self
       where Self: Sized,
             Mapper: FnOnce(Self::Repr) -> Self::Repr { ... }
    fn map_inter<Inter, Mapper>(self, mapper: Mapper) -> Self
       where Self: Sized,
             Inter: Generic<Repr = Self::Repr>,
             Mapper: FnOnce(Inter) -> Inter { ... }
}
Expand description

A trait that converts from a type to a generic representation.

For the most part, you should be using the derivation that is available through frunk_derive to generate instances of this trait for your types.

§Laws

Any implementation of Generic must satisfy the following two laws:

  1. forall x : Self. x == Generic::from(Generic::into(x))
  2. forall y : Repr. y == Generic::into(Generic::from(y))

That is, from and into should make up an isomorphism between Self and the representation type Repr.

§Examples

use frunk::Generic;

#[derive(Generic)]
struct ApiPerson<'a> {
    FirstName: &'a str,
    LastName: &'a str,
    Age: usize,
}

#[derive(Generic)]
struct DomainPerson<'a> {
    first_name: &'a str,
    last_name: &'a str,
    age: usize,
}

let a_person = ApiPerson {
    FirstName: "Joe",
    LastName: "Blow",
    Age: 30,
};
let d_person: DomainPerson = frunk::convert_from(a_person); // done

Required Associated Types§

Source

type Repr

The generic representation type.

Required Methods§

Source

fn into(self) -> Self::Repr

Convert a value to its representation type Repr.

Source

fn from(repr: Self::Repr) -> Self

Convert a value’s representation type Repr to the value’s type.

Provided Methods§

Source

fn convert_from<Src>(src: Src) -> Self
where Self: Sized, Src: Generic<Repr = Self::Repr>,

Convert a value to another type provided that they have the same representation type.

Source

fn map_repr<Mapper>(self, mapper: Mapper) -> Self
where Self: Sized, Mapper: FnOnce(Self::Repr) -> Self::Repr,

Maps the given value of type Self by first transforming it to the representation type Repr, then applying a mapper function on Repr and finally transforming it back to a value of type Self.

Source

fn map_inter<Inter, Mapper>(self, mapper: Mapper) -> Self
where Self: Sized, Inter: Generic<Repr = Self::Repr>, Mapper: FnOnce(Inter) -> Inter,

Maps the given value of type Self by first transforming it a type Inter that has the same representation type as Self, then applying a mapper function on Inter and finally transforming it back to a value of type Self.

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

Source§

impl Generic for ()

Source§

type Repr = HNil

Source§

fn into(self) -> Self::Repr

Source§

fn from(_: Self::Repr) -> Self

Source§

impl<T0> Generic for (T0,)

Source§

type Repr = HCons<T0, HNil>

Source§

fn into(self) -> Self::Repr

Source§

fn from(r: Self::Repr) -> Self

Source§

impl<T1, T0> Generic for (T1, T0)

Source§

type Repr = HCons<T1, HCons<T0, HNil>>

Source§

fn into(self) -> Self::Repr

Source§

fn from(r: Self::Repr) -> Self

Source§

impl<T2, T1, T0> Generic for (T2, T1, T0)

Source§

type Repr = HCons<T2, HCons<T1, HCons<T0, HNil>>>

Source§

fn into(self) -> Self::Repr

Source§

fn from(r: Self::Repr) -> Self

Source§

impl<T3, T2, T1, T0> Generic for (T3, T2, T1, T0)

Source§

type Repr = HCons<T3, HCons<T2, HCons<T1, HCons<T0, HNil>>>>

Source§

fn into(self) -> Self::Repr

Source§

fn from(r: Self::Repr) -> Self

Source§

impl<T4, T3, T2, T1, T0> Generic for (T4, T3, T2, T1, T0)

Source§

type Repr = HCons<T4, HCons<T3, HCons<T2, HCons<T1, HCons<T0, HNil>>>>>

Source§

fn into(self) -> Self::Repr

Source§

fn from(r: Self::Repr) -> Self

Source§

impl<T5, T4, T3, T2, T1, T0> Generic for (T5, T4, T3, T2, T1, T0)

Source§

type Repr = HCons<T5, HCons<T4, HCons<T3, HCons<T2, HCons<T1, HCons<T0, HNil>>>>>>

Source§

fn into(self) -> Self::Repr

Source§

fn from(r: Self::Repr) -> Self

Source§

impl<T6, T5, T4, T3, T2, T1, T0> Generic for (T6, T5, T4, T3, T2, T1, T0)

Source§

type Repr = HCons<T6, HCons<T5, HCons<T4, HCons<T3, HCons<T2, HCons<T1, HCons<T0, HNil>>>>>>>

Source§

fn into(self) -> Self::Repr

Source§

fn from(r: Self::Repr) -> Self

Source§

impl<T7, T6, T5, T4, T3, T2, T1, T0> Generic for (T7, T6, T5, T4, T3, T2, T1, T0)

Source§

type Repr = HCons<T7, HCons<T6, HCons<T5, HCons<T4, HCons<T3, HCons<T2, HCons<T1, HCons<T0, HNil>>>>>>>>

Source§

fn into(self) -> Self::Repr

Source§

fn from(r: Self::Repr) -> Self

Source§

impl<T8, T7, T6, T5, T4, T3, T2, T1, T0> Generic for (T8, T7, T6, T5, T4, T3, T2, T1, T0)

Source§

type Repr = HCons<T8, HCons<T7, HCons<T6, HCons<T5, HCons<T4, HCons<T3, HCons<T2, HCons<T1, HCons<T0, HNil>>>>>>>>>

Source§

fn into(self) -> Self::Repr

Source§

fn from(r: Self::Repr) -> Self

Source§

impl<T9, T8, T7, T6, T5, T4, T3, T2, T1, T0> Generic for (T9, T8, T7, T6, T5, T4, T3, T2, T1, T0)

Source§

type Repr = HCons<T9, HCons<T8, HCons<T7, HCons<T6, HCons<T5, HCons<T4, HCons<T3, HCons<T2, HCons<T1, HCons<T0, HNil>>>>>>>>>>

Source§

fn into(self) -> Self::Repr

Source§

fn from(r: Self::Repr) -> Self

Source§

impl<T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0> Generic for (T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0)

Source§

type Repr = HCons<T10, HCons<T9, HCons<T8, HCons<T7, HCons<T6, HCons<T5, HCons<T4, HCons<T3, HCons<T2, HCons<T1, HCons<T0, HNil>>>>>>>>>>>

Source§

fn into(self) -> Self::Repr

Source§

fn from(r: Self::Repr) -> Self

Source§

impl<T11, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0> Generic for (T11, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0)

Source§

type Repr = HCons<T11, HCons<T10, HCons<T9, HCons<T8, HCons<T7, HCons<T6, HCons<T5, HCons<T4, HCons<T3, HCons<T2, HCons<T1, HCons<T0, HNil>>>>>>>>>>>>

Source§

fn into(self) -> Self::Repr

Source§

fn from(r: Self::Repr) -> Self

Source§

impl<T12, T11, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0> Generic for (T12, T11, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0)

Source§

type Repr = HCons<T12, HCons<T11, HCons<T10, HCons<T9, HCons<T8, HCons<T7, HCons<T6, HCons<T5, HCons<T4, HCons<T3, HCons<T2, HCons<T1, HCons<T0, HNil>>>>>>>>>>>>>

Source§

fn into(self) -> Self::Repr

Source§

fn from(r: Self::Repr) -> Self

Source§

impl<T13, T12, T11, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0> Generic for (T13, T12, T11, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0)

Source§

type Repr = HCons<T13, HCons<T12, HCons<T11, HCons<T10, HCons<T9, HCons<T8, HCons<T7, HCons<T6, HCons<T5, HCons<T4, HCons<T3, HCons<T2, HCons<T1, HCons<T0, HNil>>>>>>>>>>>>>>

Source§

fn into(self) -> Self::Repr

Source§

fn from(r: Self::Repr) -> Self

Source§

impl<T14, T13, T12, T11, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0> Generic for (T14, T13, T12, T11, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0)

Source§

type Repr = HCons<T14, HCons<T13, HCons<T12, HCons<T11, HCons<T10, HCons<T9, HCons<T8, HCons<T7, HCons<T6, HCons<T5, HCons<T4, HCons<T3, HCons<T2, HCons<T1, HCons<T0, HNil>>>>>>>>>>>>>>>

Source§

fn into(self) -> Self::Repr

Source§

fn from(r: Self::Repr) -> Self

Source§

impl<T15, T14, T13, T12, T11, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0> Generic for (T15, T14, T13, T12, T11, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0)

Source§

type Repr = HCons<T15, HCons<T14, HCons<T13, HCons<T12, HCons<T11, HCons<T10, HCons<T9, HCons<T8, HCons<T7, HCons<T6, HCons<T5, HCons<T4, HCons<T3, HCons<T2, HCons<T1, HCons<T0, HNil>>>>>>>>>>>>>>>>

Source§

fn into(self) -> Self::Repr

Source§

fn from(r: Self::Repr) -> Self

Source§

impl<T16, T15, T14, T13, T12, T11, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0> Generic for (T16, T15, T14, T13, T12, T11, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0)

Source§

type Repr = HCons<T16, HCons<T15, HCons<T14, HCons<T13, HCons<T12, HCons<T11, HCons<T10, HCons<T9, HCons<T8, HCons<T7, HCons<T6, HCons<T5, HCons<T4, HCons<T3, HCons<T2, HCons<T1, HCons<T0, HNil>>>>>>>>>>>>>>>>>

Source§

fn into(self) -> Self::Repr

Source§

fn from(r: Self::Repr) -> Self

Source§

impl<T17, T16, T15, T14, T13, T12, T11, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0> Generic for (T17, T16, T15, T14, T13, T12, T11, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0)

Source§

type Repr = HCons<T17, HCons<T16, HCons<T15, HCons<T14, HCons<T13, HCons<T12, HCons<T11, HCons<T10, HCons<T9, HCons<T8, HCons<T7, HCons<T6, HCons<T5, HCons<T4, HCons<T3, HCons<T2, HCons<T1, HCons<T0, HNil>>>>>>>>>>>>>>>>>>

Source§

fn into(self) -> Self::Repr

Source§

fn from(r: Self::Repr) -> Self

Source§

impl<T18, T17, T16, T15, T14, T13, T12, T11, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0> Generic for (T18, T17, T16, T15, T14, T13, T12, T11, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0)

Source§

type Repr = HCons<T18, HCons<T17, HCons<T16, HCons<T15, HCons<T14, HCons<T13, HCons<T12, HCons<T11, HCons<T10, HCons<T9, HCons<T8, HCons<T7, HCons<T6, HCons<T5, HCons<T4, HCons<T3, HCons<T2, HCons<T1, HCons<T0, HNil>>>>>>>>>>>>>>>>>>>

Source§

fn into(self) -> Self::Repr

Source§

fn from(r: Self::Repr) -> Self

Source§

impl<T19, T18, T17, T16, T15, T14, T13, T12, T11, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0> Generic for (T19, T18, T17, T16, T15, T14, T13, T12, T11, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0)

Source§

type Repr = HCons<T19, HCons<T18, HCons<T17, HCons<T16, HCons<T15, HCons<T14, HCons<T13, HCons<T12, HCons<T11, HCons<T10, HCons<T9, HCons<T8, HCons<T7, HCons<T6, HCons<T5, HCons<T4, HCons<T3, HCons<T2, HCons<T1, HCons<T0, HNil>>>>>>>>>>>>>>>>>>>>

Source§

fn into(self) -> Self::Repr

Source§

fn from(r: Self::Repr) -> Self

Source§

impl<T20, T19, T18, T17, T16, T15, T14, T13, T12, T11, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0> Generic for (T20, T19, T18, T17, T16, T15, T14, T13, T12, T11, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0)

Source§

type Repr = HCons<T20, HCons<T19, HCons<T18, HCons<T17, HCons<T16, HCons<T15, HCons<T14, HCons<T13, HCons<T12, HCons<T11, HCons<T10, HCons<T9, HCons<T8, HCons<T7, HCons<T6, HCons<T5, HCons<T4, HCons<T3, HCons<T2, HCons<T1, HCons<T0, HNil>>>>>>>>>>>>>>>>>>>>>

Source§

fn into(self) -> Self::Repr

Source§

fn from(r: Self::Repr) -> Self

Source§

impl<T21, T20, T19, T18, T17, T16, T15, T14, T13, T12, T11, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0> Generic for (T21, T20, T19, T18, T17, T16, T15, T14, T13, T12, T11, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0)

Source§

type Repr = HCons<T21, HCons<T20, HCons<T19, HCons<T18, HCons<T17, HCons<T16, HCons<T15, HCons<T14, HCons<T13, HCons<T12, HCons<T11, HCons<T10, HCons<T9, HCons<T8, HCons<T7, HCons<T6, HCons<T5, HCons<T4, HCons<T3, HCons<T2, HCons<T1, HCons<T0, HNil>>>>>>>>>>>>>>>>>>>>>>

Source§

fn into(self) -> Self::Repr

Source§

fn from(r: Self::Repr) -> Self

Source§

impl<T22, T21, T20, T19, T18, T17, T16, T15, T14, T13, T12, T11, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0> Generic for (T22, T21, T20, T19, T18, T17, T16, T15, T14, T13, T12, T11, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0)

Source§

type Repr = HCons<T22, HCons<T21, HCons<T20, HCons<T19, HCons<T18, HCons<T17, HCons<T16, HCons<T15, HCons<T14, HCons<T13, HCons<T12, HCons<T11, HCons<T10, HCons<T9, HCons<T8, HCons<T7, HCons<T6, HCons<T5, HCons<T4, HCons<T3, HCons<T2, HCons<T1, HCons<T0, HNil>>>>>>>>>>>>>>>>>>>>>>>

Source§

fn into(self) -> Self::Repr

Source§

fn from(r: Self::Repr) -> Self

Source§

impl<T23, T22, T21, T20, T19, T18, T17, T16, T15, T14, T13, T12, T11, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0> Generic for (T23, T22, T21, T20, T19, T18, T17, T16, T15, T14, T13, T12, T11, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1, T0)

Source§

type Repr = HCons<T23, HCons<T22, HCons<T21, HCons<T20, HCons<T19, HCons<T18, HCons<T17, HCons<T16, HCons<T15, HCons<T14, HCons<T13, HCons<T12, HCons<T11, HCons<T10, HCons<T9, HCons<T8, HCons<T7, HCons<T6, HCons<T5, HCons<T4, HCons<T3, HCons<T2, HCons<T1, HCons<T0, HNil>>>>>>>>>>>>>>>>>>>>>>>>

Source§

fn into(self) -> Self::Repr

Source§

fn from(r: Self::Repr) -> Self

Implementors§