usecrate::lazy_bool::LazyBool; use darling::FromDeriveInput; use proc_macro::TokenStream; use proc_macro2::TokenStream as TokenStream2; use quote::ToTokens; use std::ops::{BitAnd, BitOr, Not}; use syn::{
parse::{Parse, ParseStream},
parse_quote,
punctuated::Punctuated,
Attribute, DeriveInput, Generics, Meta, Path, PathSegment, Token, TypeGenerics, WhereClause,
};
/// Merge multiple [`syn::Error`] into one. pub(crate) trait IteratorExt { fn collect_error(self) -> syn::Result<()> where Self: Iterator<Item = syn::Result<()>> + Sized,
{ let accu = Ok(()); self.fold(accu, |accu, error| match (accu, error) {
(Ok(()), error) => error,
(accu, Ok(())) => accu,
(Err(mut err), Err(error)) => {
err.combine(error);
Err(err)
}
})
}
} impl<I> IteratorExt for I where I: Iterator<Item = syn::Result<()>> + Sized {}
/// Attributes usable for derive macros #[derive(FromDeriveInput)] #[darling(attributes(serde_with))] pub(crate) struct DeriveOptions { /// Path to the crate #[darling(rename = "crate", default)] pub(crate) alt_crate_path: Option<Path>,
}
/// Determine if there is a `#[derive(JsonSchema)]` on this struct. pub(crate) fn has_derive_jsonschema(input: TokenStream) -> syn::Result<SchemaFieldConfig> { fn parse_derive_args(input: ParseStream<'_>) -> syn::Result<Punctuated<Path, Token![,]>> {
Punctuated::parse_terminated_with(input, Path::parse_mod_style)
}
fn eval_meta(meta: &Meta) -> syn::Result<SchemaFieldConfig> { match meta.path() {
path if path.is_ident("cfg_attr") => { let CfgAttr {
condition, metas, ..
} = meta.require_list()?.parse_args()?;
Ok(eval_metas(&metas)? & SchemaFieldConfig::Lazy(condition.into()))
}
path if path.is_ident("derive") => { let config = meta
.require_list()?
.parse_args_with(parse_derive_args)?
.into_iter()
.any(|Path { segments, .. }| { // This matches `JsonSchema`, `schemars::JsonSchema` // as well as any other path ending with `JsonSchema`. // This will not match aliased `JsonSchema`s, // but might match other `JsonSchema` not `schemars::JsonSchema`! match segments.last() {
Some(PathSegment { ident, .. }) => ident == "JsonSchema",
_ => false,
}
})
.then_some(SchemaFieldConfig::True)
.unwrap_or_default();
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.