iref-enum

Crates.ioiref-enum
lib.rsiref-enum
version3.0.0
sourcesrc
created_at2020-04-25 21:38:23.497282
updated_at2023-08-23 15:59:50.372515
descriptionDerive macro for IRI-like enum types
homepage
repositoryhttps://github.com/timothee-haudebourg/iref-enum
max_upload_size
id234098
size38,534
Timothée Haudebourg (timothee-haudebourg)

documentation

https://docs.rs/iref-enum

README

IRI Enums.

CI Crate informations License Documentation

This is a companion crate for iref providing a derive macro to declare enum types that converts into/from IRIs.

Storage and comparison of IRIs can be costly. One may prefer the use of an enum type representing known IRIs with cheap conversion functions between the two. This crate provides a way to declare such enums in an simple way through the use of a IriEnum derive macro. This macro will implement TryFrom<Iri> and Into<Iri> for you.

Basic usage

Use #[derive(IriEnum)] attribute to generate the implementation of TryFrom<Iri> and Into<Iri> for the enum type. The IRI of each variant is defined with the iri attribute:

use iref_enum::IriEnum;

#[derive(IriEnum, PartialEq, Debug)]
pub enum Vocab {
  #[iri("https://schema.org/name")] Name,
  #[iri("https://schema.org/knows")] Knows
}

pub fn main() {
  let term: Vocab = static_iref::iri!("https://schema.org/name").try_into().unwrap();
  assert_eq!(term, Vocab::Name)
}

Each variant must have at most one parameter. If it has a parameter, its type must implement TryFrom<Iri> and Into<Iri>.

Compact IRIs

The derive macro also support compact IRIs using the special iri_prefix attribute. First declare a prefix associated to a given IRI. Then any iri attribute of the form prefix:suffix we be expanded into the concatenation of the prefix IRI and suffix.

#[derive(IriEnum)]
#[iri_prefix("schema" = "https://schema.org/")]
pub enum Vocab {
  #[iri("schema:name")] Name,
  #[iri("schema:knows")] Knows
}

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Commit count: 13

cargo fmt