Attribute for defining examples (#23)

This commit is contained in:
Graham Esau 2020-05-17 16:41:19 +01:00
parent 19b9bef395
commit e259955809
4 changed files with 88 additions and 3 deletions

View file

@ -16,7 +16,7 @@ pub struct Attrs {
pub title: Option<String>,
pub description: Option<String>,
pub deprecated: bool,
// TODO pub example: Option<syn::Path>,
pub examples: Vec<syn::Path>,
}
#[derive(Debug)]
@ -111,6 +111,12 @@ impl Attrs {
}
}
Meta(NameValue(m)) if m.path.is_ident("example") => {
if let Ok(fun) = parse_lit_into_path(errors, attr_type, "example", &m.lit) {
self.examples.push(fun)
}
}
Meta(_meta_item) => {
// TODO uncomment this for 0.8.0 (breaking change)
// https://github.com/GREsau/schemars/issues/18

View file

@ -3,13 +3,14 @@ use attr::Attrs;
use proc_macro2::{Ident, Span, TokenStream};
use quote::{ToTokens, TokenStreamExt};
#[derive(Debug, Clone, Default)]
#[derive(Debug, Clone)]
pub struct SchemaMetadata<'a> {
pub title: Option<&'a str>,
pub description: Option<&'a str>,
pub deprecated: bool,
pub read_only: bool,
pub write_only: bool,
pub examples: &'a [syn::Path],
pub default: Option<TokenStream>,
}
@ -36,7 +37,10 @@ impl<'a> SchemaMetadata<'a> {
title: attrs.title.as_ref().and_then(none_if_empty),
description: attrs.description.as_ref().and_then(none_if_empty),
deprecated: attrs.deprecated,
..Default::default()
examples: &attrs.examples,
read_only: false,
write_only: false,
default: None,
}
}
@ -80,6 +84,17 @@ impl<'a> SchemaMetadata<'a> {
});
}
if !self.examples.is_empty() {
let examples = self.examples.iter().map(|eg| {
quote! {
schemars::_serde_json::value::to_value(#eg())
}
});
setters.push(quote! {
metadata.examples = vec![#(#examples),*].into_iter().flatten().collect();
});
}
if let Some(default) = &self.default {
setters.push(quote! {
metadata.default = #default.and_then(|d| schemars::_serde_json::value::to_value(d).ok());