Auto Covnert between structs.
A simple struct convert.
```rust use struct_convert::Convert;
struct B { bid: String, num: String, name: String, }
struct C {
cid: Option
struct A { #[convertfield(class = "B", rename = "bid", tostring)] #[convertfield(class = "C", rename = "cid", customfn = "wrap_id")] id: i64,
#[convert_field(to_string)]
num: i64,
#[convert_field(unwrap)]
name: Option<String>,
}
fn wrapid(a: &A) -> Option
fn main() { let a = A { id: 2, num: 1, name: Some("Jack".tostring()), }; let b: B = a.clone().into(); debugasserteq!( B { num: "1".tostring(), bid: 2.tostring(), name: "Jack".tostring(), }, b );
let c: C = a.into();
debug_assert_eq!(
C {
num: "1".to_string(),
cid: Some("2".into()),
name: "Jack".to_string(),
},
c
);
}
```
Inner stuct convert.
```rust use struct_convert::Convert;
struct BInner { name: String, }
struct B { bid: i64, inner: BInner, }
struct A { #[convert_field(rename = "bid")] id: i64,
inner: AInner,
}
struct AInner { name: String, }
fn main() { let a = A { id: 2, inner: AInner { name: String::from("AInner"), }, }; let b: B = a.into(); debugasserteq!( B { bid: 2, inner: BInner { name: String::from("AInner") }, }, b ); } ```
Option field convert.
```rust use struct_convert::Convert;
struct BInner { name: String, }
struct B {
name: String,
name2: String,
optstr: Option
struct A {
#[convert_field(unwrap)]
name: Option
#[convert_field(unwrap)]
name2: Option<String>,
#[convert_field(option)]
opt_str: String,
#[convert_field(option)]
opt_str2: Option<String>,
}
struct AInner { name: String, }
fn main() { let a = A { name: Some("Jack".tostring()), optstr: String::from("str"), optstr2: Some(String::from("Option")), name2: None, }; let b: B = a.into(); debugasserteq!( B { name: "Jack".tostring(), optstr: Some(String::from("str")), optstr2: Some(String::from("Option")), name2: "".to_string() }, b ); } ```
Ignore Some fileds.
```rust use struct_convert::Convert;
struct B { num: String, name: String, }
struct A { #[convert_field(ignore)] id: i64,
#[convert_field(to_string)]
num: i64,
#[convert_field(unwrap)]
name: Option<String>,
}
fn main() { let a = A { id: 2, num: 1, name: Some("Jack".tostring()), }; let b: B = a.into(); debugasserteq!( B { num: "1".tostring(), name: "Jack".to_string(), }, b ); } ```
convert B from A ```rust use struct_convert::Convert;
struct BInner { name: String, }
struct B {
#[convert_field(rename = "id")]
bid: i64,
#[convert_field(to_string)]
num: String,
#[convert_field(unwrap)]
name: String,
inner: BInner,
#[convert_field(wrap)]
opt_str: Option<String>,
opt_str2: Option<String>
}
struct A {
ignoref: i64,
id: i64,
num: i64,
name: Option
struct AInner { name: String, }
fn main() { let a = A { id: 2, num: 1, name: Some("Jack".tostring()), inner: AInner { name: String::from("AInner"), }, optstr: String::from("str"), optstr2: Some(String::from("Option")), ignoref: 1, }; let b: B = a.into(); debugasserteq!( B { num: "1".tostring(), bid: 2, name: "Jack".tostring(), inner: BInner { name: String::from("AInner") }, optstr: Some(String::from("str")), optstr2: Some(String::from("Option")) }, b ); } ```
Convert with custom function.
```rust use struct_convert::Convert;
struct B { bid: i64, }
struct A { #[convertfield(rename = "bid", customfn = "strtoi64")] id_str: String, }
struct C { #[convertfield(rename = "bid", customfn = "to_point")] point: Point, }
struct Point(i64, i64);
fn strtoi64(a: &A) -> i64 { a.id_str.parse().unwrap() }
fn to_point(b: &B) -> Point { Point(b.bid, b.bid) }
fn main() { let a = A { idstr: "4".into() }; let b: B = a.into(); debugasserteq!(B { bid: 4 }, b); let c: C = b.into(); debugassert_eq!(C { point: Point(4, 4) }, c);
}
```
More examples look here.
Welcome PR.