AsSchema

Trait AsSchema 

Source
pub trait AsSchema {
    // Required method
    fn as_schema() -> Schema;
}
Expand description

Trait for Rust types that can generate a Schema (a subset of OpenAPI schemas) automatically.

Implement this trait or derive AsSchema to enable schema generation for your types. The derive macro supports extensive customization through attributes and integrates with Serde.

§Description Attributes

Descriptions can now span multiple lines. You can use multiple #[schema(description = "...")] attributes on a field or a struct. Each attribute’s content will be concatenated.

To add a new line, use an empty #[schema(description = "")] attribute, similar to how the standard /// documentation comments work.

§Examples

use google_ai_rs::AsSchema;

#[derive(AsSchema)]
#[schema(rename_all = "camelCase")]
struct AiReport {
    // A single-line description
    #[schema(description = "This should include user's name and date of birth", required)]
    data: String,

    // A multi-line description
    #[schema(description = "This field contains important metadata.")]
    #[schema(description = "")] // New line
    #[schema(description = "For example, the creation timestamp and author.")]
    metadata: String,
}

§Customizing Foreign Types

For types from other crates where you can’t add the derive, you can either manually specify its schema or reference a function that generates it.

1. Using r#type and format:

use google_ai_rs::AsSchema;

#[derive(AsSchema)]
struct AiReport {
    #[schema(r#type = "Number", format = "double")]
    foreign: some_crate::TheirType
}

2. Using as_schema with a function:

This is useful for more complex foreign types.

use google_ai_rs::{AsSchema, Schema, schema::SchemaFormat};

#[derive(AsSchema)]
struct AiReport {
    #[schema(as_schema = "foreign_type_schema")]
    foreign: some_crate::TheirType
}

fn foreign_type_schema() -> Schema {
    Schema::new_object()
        .description("A custom schema for a foreign type.")
        .property("id", Schema::new_number().format(SchemaFormat::Int64))
}

§Serde Compatibility

The AsSchema derive macro automatically integrates with serde attributes for convenience.

  • #[serde(rename)]/#[serde(rename_all)] are respected for naming fields in the schema.
  • #[serde(skip)] fields are automatically excluded from the generated schema.
  • You can disable Serde integration for a specific field with #[schema(ignore_serde)] or for the whole type with #[schema(serde_ignore)] on the struct.

§Examples with Serde

use google_ai_rs::AsSchema;

#[derive(AsSchema, serde::Deserialize)]
struct AiReport {
    #[schema(description = "Important field", required)]
    #[serde(rename = "json_field")] // Applies to the schema too
    field: String,

    #[serde(skip)] // Excluded from schema
    internal: String,

    #[schema(skip)] // Overrides Serde's behavior and excludes from schema
    #[serde(rename = "count")] // This rename is ignored by the schema
    item_count: i32,
}

Required Methods§

Source

fn as_schema() -> Schema

Generates the OpenAPI schema for this type

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

Source§

impl AsSchema for bool

Source§

impl AsSchema for char

Source§

impl AsSchema for f32

Source§

impl AsSchema for f64

Source§

impl AsSchema for i8

Source§

impl AsSchema for i16

Source§

impl AsSchema for i32

Source§

impl AsSchema for i64

Source§

impl AsSchema for i128

Source§

impl AsSchema for isize

Source§

impl AsSchema for str

Source§

impl AsSchema for u8

Source§

impl AsSchema for u16

Source§

impl AsSchema for u32

Source§

impl AsSchema for u64

Source§

impl AsSchema for u128

Source§

impl AsSchema for ()

Source§

impl AsSchema for usize

Source§

impl AsSchema for CString

Source§

impl AsSchema for String

Source§

impl AsSchema for CStr

Source§

impl AsSchema for AtomicBool

Source§

impl AsSchema for AtomicI8

Source§

impl AsSchema for AtomicI16

Source§

impl AsSchema for AtomicI32

Source§

impl AsSchema for AtomicI64

Source§

impl AsSchema for AtomicIsize

Source§

impl AsSchema for AtomicU8

Source§

impl AsSchema for AtomicU16

Source§

impl AsSchema for AtomicU32

Source§

impl AsSchema for AtomicU64

Source§

impl AsSchema for AtomicUsize

Source§

impl AsSchema for Path

Source§

impl AsSchema for PathBuf

Source§

impl AsSchema for NonZeroI8

Source§

impl AsSchema for NonZeroI16

Source§

impl AsSchema for NonZeroI32

Source§

impl AsSchema for NonZeroI64

Source§

impl AsSchema for NonZeroI128

Source§

impl AsSchema for NonZeroIsize

Source§

impl AsSchema for NonZeroU8

Source§

impl AsSchema for NonZeroU16

Source§

impl AsSchema for NonZeroU32

Source§

impl AsSchema for NonZeroU64

Source§

impl AsSchema for NonZeroU128

Source§

impl AsSchema for NonZeroUsize

Source§

impl<'a, T> AsSchema for RefMut<'a, T>
where T: AsSchema + ?Sized,

Source§

impl<'a, T: AsSchema + ToOwned + ?Sized + 'a> AsSchema for Cow<'a, T>

Source§

impl<T> AsSchema for Box<T>
where T: AsSchema + ?Sized,

Source§

impl<T> AsSchema for BinaryHeap<T>
where T: AsSchema,

Source§

impl<T> AsSchema for BTreeSet<T>
where T: AsSchema,

Source§

impl<T> AsSchema for LinkedList<T>
where T: AsSchema,

Source§

impl<T> AsSchema for VecDeque<T>
where T: AsSchema,

Source§

impl<T> AsSchema for Rc<T>
where T: AsSchema + ?Sized,

Source§

impl<T> AsSchema for Weak<T>
where T: AsSchema + ?Sized,

Source§

impl<T> AsSchema for Arc<T>
where T: AsSchema + ?Sized,

Source§

impl<T> AsSchema for Weak<T>
where T: AsSchema + ?Sized,

Source§

impl<T> AsSchema for Vec<T>
where T: AsSchema,

Source§

impl<T> AsSchema for Cell<T>
where T: AsSchema + ?Sized,

Source§

impl<T> AsSchema for RefCell<T>
where T: AsSchema + ?Sized,

Source§

impl<T> AsSchema for PhantomData<T>
where T: AsSchema + ?Sized,

Source§

impl<T> AsSchema for HashSet<T>
where T: AsSchema,

Source§

impl<T> AsSchema for Mutex<T>
where T: AsSchema + ?Sized,

Source§

impl<T> AsSchema for RwLock<T>
where T: AsSchema + ?Sized,

Source§

impl<T> AsSchema for Mutex<T>
where T: AsSchema + ?Sized,

Source§

impl<T> AsSchema for RwLock<T>
where T: AsSchema + ?Sized,

Source§

impl<T: AsSchema + ?Sized> AsSchema for *const T

Source§

impl<T: AsSchema + ?Sized> AsSchema for *mut T

Source§

impl<T: AsSchema + ?Sized> AsSchema for &T

Source§

impl<T: AsSchema + ?Sized> AsSchema for &mut T

Source§

impl<T: AsSchema> AsSchema for Option<T>

Source§

impl<T: AsSchema, const N: usize> AsSchema for [T; N]

Implementors§

Source§

impl AsSchema for Tuple<()>

Source§

impl<T0> AsSchema for Tuple<(T0,)>
where T0: AsSchema,

Source§

impl<T0, T1> AsSchema for Tuple<(T0, T1)>
where T0: AsSchema, T1: AsSchema,

Source§

impl<T0, T1, T2> AsSchema for Tuple<(T0, T1, T2)>
where T0: AsSchema, T1: AsSchema, T2: AsSchema,

Source§

impl<T0, T1, T2, T3> AsSchema for Tuple<(T0, T1, T2, T3)>
where T0: AsSchema, T1: AsSchema, T2: AsSchema, T3: AsSchema,

Source§

impl<T0, T1, T2, T3, T4> AsSchema for Tuple<(T0, T1, T2, T3, T4)>
where T0: AsSchema, T1: AsSchema, T2: AsSchema, T3: AsSchema, T4: AsSchema,

Source§

impl<T0, T1, T2, T3, T4, T5> AsSchema for Tuple<(T0, T1, T2, T3, T4, T5)>
where T0: AsSchema, T1: AsSchema, T2: AsSchema, T3: AsSchema, T4: AsSchema, T5: AsSchema,

Source§

impl<T0, T1, T2, T3, T4, T5, T6> AsSchema for Tuple<(T0, T1, T2, T3, T4, T5, T6)>
where T0: AsSchema, T1: AsSchema, T2: AsSchema, T3: AsSchema, T4: AsSchema, T5: AsSchema, T6: AsSchema,

Source§

impl<T0, T1, T2, T3, T4, T5, T6, T7> AsSchema for Tuple<(T0, T1, T2, T3, T4, T5, T6, T7)>
where T0: AsSchema, T1: AsSchema, T2: AsSchema, T3: AsSchema, T4: AsSchema, T5: AsSchema, T6: AsSchema, T7: AsSchema,

Source§

impl<T0, T1, T2, T3, T4, T5, T6, T7, T8> AsSchema for Tuple<(T0, T1, T2, T3, T4, T5, T6, T7, T8)>
where T0: AsSchema, T1: AsSchema, T2: AsSchema, T3: AsSchema, T4: AsSchema, T5: AsSchema, T6: AsSchema, T7: AsSchema, T8: AsSchema,

Source§

impl<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> AsSchema for Tuple<(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9)>
where T0: AsSchema, T1: AsSchema, T2: AsSchema, T3: AsSchema, T4: AsSchema, T5: AsSchema, T6: AsSchema, T7: AsSchema, T8: AsSchema, T9: AsSchema,

Source§

impl<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> AsSchema for Tuple<(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)>
where T0: AsSchema, T1: AsSchema, T2: AsSchema, T3: AsSchema, T4: AsSchema, T5: AsSchema, T6: AsSchema, T7: AsSchema, T8: AsSchema, T9: AsSchema, T10: AsSchema,

Source§

impl<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> AsSchema for Tuple<(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)>
where T0: AsSchema, T1: AsSchema, T2: AsSchema, T3: AsSchema, T4: AsSchema, T5: AsSchema, T6: AsSchema, T7: AsSchema, T8: AsSchema, T9: AsSchema, T10: AsSchema, T11: AsSchema,

Source§

impl<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> AsSchema for Tuple<(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)>
where T0: AsSchema, T1: AsSchema, T2: AsSchema, T3: AsSchema, T4: AsSchema, T5: AsSchema, T6: AsSchema, T7: AsSchema, T8: AsSchema, T9: AsSchema, T10: AsSchema, T11: AsSchema, T12: AsSchema,

Source§

impl<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> AsSchema for Tuple<(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)>
where T0: AsSchema, T1: AsSchema, T2: AsSchema, T3: AsSchema, T4: AsSchema, T5: AsSchema, T6: AsSchema, T7: AsSchema, T8: AsSchema, T9: AsSchema, T10: AsSchema, T11: AsSchema, T12: AsSchema, T13: AsSchema,

Source§

impl<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> AsSchema for Tuple<(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)>
where T0: AsSchema, T1: AsSchema, T2: AsSchema, T3: AsSchema, T4: AsSchema, T5: AsSchema, T6: AsSchema, T7: AsSchema, T8: AsSchema, T9: AsSchema, T10: AsSchema, T11: AsSchema, T12: AsSchema, T13: AsSchema, T14: AsSchema,

Source§

impl<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> AsSchema for Tuple<(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)>
where T0: AsSchema, T1: AsSchema, T2: AsSchema, T3: AsSchema, T4: AsSchema, T5: AsSchema, T6: AsSchema, T7: AsSchema, T8: AsSchema, T9: AsSchema, T10: AsSchema, T11: AsSchema, T12: AsSchema, T13: AsSchema, T14: AsSchema, T15: AsSchema,

Source§

impl<T> AsSchema for Map<T>
where T: MapTrait, T::Key: AsSchema, T::Value: AsSchema,