Skip to content

Latest commit

 

History

History
185 lines (115 loc) · 8.56 KB

1.1-attributes.md

File metadata and controls

185 lines (115 loc) · 8.56 KB
layout title parent nav_order permalink
default
Attributes
Deriving JsonSchema
1
/deriving/attributes/
<style> h3 code { font-weight: bold; } </style>

Attributes

You can add attributes to your types to customize Schemars's derived JsonSchema implementation.

Serde also allows setting #[serde(...)] attributes which change how types are serialized, and Schemars will generally respect these attributes to ensure that generated schemas will match how the type is serialized by serde_json. #[serde(...)] attributes can be overriden using #[schemars(...)] attributes, which behave identically (e.g. #[schemars(rename_all = "camelCase")]). You may find this useful if you want to change the generated schema without affecting Serde's behaviour, or if you're just not using Serde.

Table of Contents

  1. Supported Serde Attributes
  2. Other Attributes

Supported Serde Attributes

#[serde(rename = "name")] / #[schemars(rename = "name")]

Set on a struct, enum, field or variant to use the given name in the generated schema instead of the Rust name. When used on a struct or enum, the given name will be used as the title for root schemas, and the key within the root's definitions property for subschemas.

If set on a struct or enum with generic type parameters, then the given name may contain them enclosed in curly braces (e.g. {T}) and they will be replaced with the concrete type names when the schema is generated.

Serde docs: container / variant / field

#[serde(rename_all = "...")] / #[schemars(rename_all = "...")]

Set on a struct, enum or variant to rename all fields according to the given case convention (see the Serde docs for details).

Serde docs: container / variant

#[serde(tag = "type")] / #[schemars(tag = "type")]
#[serde(tag = "t", content = "c")] / #[schemars(tag = "t", content = "c")]
#[serde(untagged)] / #[schemars(untagged)]

Set on an enum to generate the schema for the internally tagged, adjacently tagged, or untagged representation of this enum.

Serde docs: tag / tag+content / untagged

#[serde(default)] / #[schemars(default)] / #[serde(default = "path")] / #[schemars(default = "path")]

Set on a struct or field to give fields a default value, which excludes them from the schema's required properties. The default will also be set on the field's schema's default property, unless it is skipped by a skip_serializing_if attribute on the field. Any serialize_with or with attribute set on the field will be used to serialize the default value.

Serde docs: container / field

#[serde(skip)] / #[schemars(skip)]

Set on a variant or field to prevent it from appearing in any generated schema.

Serde docs: variant / field

#[serde(skip_serializing)] / #[schemars(skip_serializing)]

Set on a field of a (non-tuple) struct to set the writeOnly property on that field's schema. Serde also allows this attribute on variants or tuple struct fields, but this will have no effect on generated schemas.

Serde docs: field

#[serde(skip_deserializing)] / #[schemars(skip_deserializing)]

Set on a variant or field. When set on a field of a (non-tuple) struct, that field's schema will have the readOnly property set. When set on a variant or tuple struct field Schemars will treat this the same as a skip attribute.

Serde docs: variant / field

#[serde(flatten)] / #[schemars(flatten)]

Set on a field to include that field's contents as though they belonged to the field's container.

Serde docs: field

#[serde(with = "Type")] / #[schemars(with = "Type")]

Set on a variant or field to generate its schema as the given type instead of its actual type. Serde allows the with attribute to refer to any module path, but Schemars requires this to be an actual type which implements JsonSchema.

If the given type has any required generic type parameters, then they must all be explicitly specified in this attribute. Serde frequently allows you to omit them as it can make use of type inference, but unfortunately this is not possible with Schemars. For example, with = "Vec::<i32>" will work, but with = "Vec" and with = "Vec::<_>" will not.

Serde docs: variant / field

#[serde(deny_unknown_fields)] / #[schemars(deny_unknown_fields)]

Setting this on a container will set the additionalProperties keyword on generated schemas to false to show that any extra properties are explicitly disallowed.

Serde docs: container

#[serde(transparent)] / #[schemars(transparent)]

Set on a newtype struct or a braced struct with one field to make the struct's generated schema exactly the same as that of the single field's.

Serde docs: container

Other Attributes

#[schemars(schema_with = "some::function")]

Set on a variant or field to generate this field's schema using the given function. This function must be callable as fn(&mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema.

#[schemars(title = "Some title", description = "Some description")]

Set on a container, variant or field to set the generated schema's title and/or description. If present, these will be used instead of values from any doc comments/attributes.

#[schemars(example = "some::function")]

Set on a container, variant or field to include the result of the given function in the generated schema's examples. The function should take no parameters and can return any type that implements serde's Serialize trait - it does not need to return the same type as the attached struct/field. This attribute can be repeated to specify multiple examples.

#[deprecated]

Set the Rust built-in deprecated attribute on a struct, enum, field or variant to set the generated schema's deprecated keyword to true.

Doc Comments (#[doc = "..."])

If a struct, variant or field has any doc comments (or doc attributes), then these will be used as the generated schema's description. If the first line is an ATX-style markdown heading (i.e. it begins with a # character), then it will be used as the schema's title, and the remaining lines will be the description.