linked-data-core 0.2.3

Core library for Linked Data crates
Documentation
use oxiri::Iri;
use snafu::ResultExt;

use crate::attributes::ast::FieldAttribute;
use crate::attributes::parse_ld_attributes;
use crate::prefix_mappings::PrefixMappings;
use crate::{Error, InvalidMappingSnafu};

#[derive(Debug, Default)]
pub struct RdfFieldAttributes {
  pub flatten: bool,
  pub is_graph: bool,
  pub ignore: bool,
  pub predicate: Option<Iri<String>>,
  pub is_id: bool,
}

impl RdfFieldAttributes {
  pub fn try_from_attrs(
    attrs: Vec<syn::Attribute>,
    prefix_mappings: &PrefixMappings,
  ) -> Result<Self, Error> {
    let field_attrs = parse_ld_attributes(&attrs)?;

    let mut attributes = RdfFieldAttributes::default();

    for attr in field_attrs {
      match attr {
        FieldAttribute::Ignore => {
          attributes.ignore = true;
        }
        FieldAttribute::Iri(lit_str) => {
          if attributes.predicate.is_some() {
            return Err(Error::MultipleIris {
              span: lit_str.span(),
            });
          }
          let iri = prefix_mappings
            .expand(lit_str.value())
            .context(InvalidMappingSnafu {
              span: lit_str.span(),
            })?;
          attributes.predicate = Some(iri);
        }
        FieldAttribute::Flatten => {
          attributes.flatten = true;
        }
        FieldAttribute::Id => {
          attributes.is_id = true;
        }

        FieldAttribute::Graph => {
          attributes.is_graph = true;
        }
      }
    }

    Ok(attributes)
  }
}