py-rs-macros 0.1.1

derive macro for py-rs
Documentation
use quote::quote;
use syn::{FieldsUnnamed, Result};

use crate::{
    attr::{Attr, ContainerAttr, FieldAttr, StructAttr},
    deps::Dependencies,
    DerivedPY,
};

pub(crate) fn newtype(attr: &StructAttr, name: &str, fields: &FieldsUnnamed) -> Result<DerivedPY> {
    let inner = fields.unnamed.first().unwrap();

    let field_attr = FieldAttr::from_attrs(&inner.attrs)?;
    field_attr.assert_validity(inner)?;

    let crate_rename = attr.crate_rename();

    if field_attr.skip {
        return super::unit::null(attr, name);
    }

    let inner_ty = field_attr.type_as(&inner.ty);

    let mut dependencies = Dependencies::new(crate_rename.clone());

    match (&field_attr.type_override, field_attr.inline) {
        (Some(_), _) => (),
        (None, true) => dependencies.append_from(&inner_ty),
        (None, false) => dependencies.push(&inner_ty),
    };

    let inline_def = match field_attr.type_override {
        Some(ref o) => quote!(#o.to_owned()),
        None if field_attr.inline => quote!(<#inner_ty as #crate_rename::PY>::inline()),
        None => quote!(<#inner_ty as #crate_rename::PY>::name()),
    };

    Ok(DerivedPY {
        crate_rename,
        inline: inline_def,
        inline_flattened: None,
        docs: attr.docs.clone(),
        dependencies,
        export: attr.export,
        export_to: attr.export_to.clone(),
        py_name: name.to_owned(),
        enum_def: None,
        concrete: attr.concrete.clone(),
        bound: attr.bound.clone(),
    })
}