strunemix 0.4.0

Strunemix allows make a form with a struct, by deriving enums of it
Documentation

strunemix

Strunemix allows to work with structs as if they were enums.

Example

use strunemix::*;

#[derive(Debug, PartialEq, Clone, Strunemix)]
#[strunemix_derive_data(Debug, PartialEq, Clone)]
struct Person {
   pseudo: String,
   phone: Option<String>,
   age: i32,
}

let person = Person {
    pseudo: "MyCoolPseudo".to_string(),
    phone: Some("123456789".to_string()),
    age: 42
};

let pseudo_name = PersonAttrName::Pseudo;
let phone_name = PersonAttrName::Phone;
let age_name = PersonAttrName::Age;

assert_eq!(Person::as_attr_name_array(), [pseudo_name, phone_name, age_name]);
assert_eq!(pseudo_name.name(), "pseudo");
assert_eq!(phone_name.name(), "phone");
assert_eq!(age_name.name(), "age");

let pseudo_data = PersonAttrData::Pseudo("MyCoolPseudo".to_string());
let phone_data = PersonAttrData::Phone(Some("123456789".to_string()));
let age_data = PersonAttrData::Age(42);

let person_data = person.clone().to_attr_data_array();
assert_eq!(person_data, [pseudo_data.clone(), phone_data.clone(), age_data.clone()]);

let personcopy = Person::from_attr_data_array([pseudo_data, phone_data, age_data]).unwrap();

assert_eq!(person, personcopy);

If you want to build the attribute data from string values, you must implement the [StrunemixParsableData] trait to handle the conversion from the data to the struct fields.

impl StrunemixParsableData<'_, PersonAttrName> for PersonAttrData {
  fn with_attr_name(name: PersonAttrName, data: &str) -> Result<Self, ()> {
    match name {
      PersonAttrName::Pseudo => Ok(PersonAttrData::Pseudo(data.to_string())),
      PersonAttrName::Phone => Ok(PersonAttrData::Phone(Some(data.to_string()))),
      PersonAttrName::Age => data.parse().map_err(|_| ()).map(|age| PersonAttrData::Age(age))
    }
  }
}

let pseudo_name = PersonAttrName::Pseudo;
let psudo_name_str = "pseudo";
let data = "MyCoolPseudo";

let pseudo_expected = PersonAttrData::Pseudo("MyCoolPseudo".to_string());
let pseudo_from_name = PersonAttrData::with_attr_name(pseudo_name, data).unwrap();
let pseudo_from_str = PersonAttrData::with_attr_str(psudo_name_str, data).unwrap();

assert_eq!(&pseudo_expected, &pseudo_from_name);
assert_eq!(&pseudo_expected, &pseudo_from_str);

License: MIT