codama_attributes/codama_directives/
codama_directive.rs1use crate::{
2    AccountDirective, ArgumentDirective, AttributeContext, DefaultValueDirective,
3    DiscriminatorDirective, EncodingDirective, EnumDiscriminatorDirective, ErrorDirective,
4    FieldDirective, FixedSizeDirective, NameDirective, SizePrefixDirective, TypeDirective,
5};
6use codama_syn_helpers::{extensions::*, Meta};
7use derive_more::derive::From;
8
9#[derive(Debug, PartialEq, From)]
10pub enum CodamaDirective {
11    Type(TypeDirective),
13    DefaultValue(DefaultValueDirective),
14    Encoding(EncodingDirective),
15    Field(FieldDirective),
16    FixedSize(FixedSizeDirective),
17    SizePrefix(SizePrefixDirective),
18
19    Discriminator(DiscriminatorDirective),
21    EnumDiscriminator(EnumDiscriminatorDirective),
22    Name(NameDirective),
23
24    Account(AccountDirective),
26    Argument(ArgumentDirective),
27
28    Error(ErrorDirective),
30}
31
32impl CodamaDirective {
33    pub fn parse(meta: &Meta, ctx: &AttributeContext) -> syn::Result<Self> {
34        let path = meta.path()?;
35        match path.to_string().as_str() {
36            "type" => Ok(TypeDirective::parse(meta)?.into()),
38            "default_value" => Ok(DefaultValueDirective::parse(meta)?.into()),
39            "encoding" => Ok(EncodingDirective::parse(meta)?.into()),
40            "field" => Ok(FieldDirective::parse(meta)?.into()),
41            "fixed_size" => Ok(FixedSizeDirective::parse(meta)?.into()),
42            "size_prefix" => Ok(SizePrefixDirective::parse(meta)?.into()),
43
44            "discriminator" => Ok(DiscriminatorDirective::parse(meta)?.into()),
46            "enum_discriminator" => Ok(EnumDiscriminatorDirective::parse(meta)?.into()),
47            "name" => Ok(NameDirective::parse(meta)?.into()),
48
49            "account" => Ok(AccountDirective::parse(meta, ctx)?.into()),
51            "argument" => Ok(ArgumentDirective::parse(meta)?.into()),
52
53            "error" => Ok(ErrorDirective::parse(meta)?.into()),
55
56            _ => Err(path.error("unrecognized codama directive")),
57        }
58    }
59
60    pub fn name(&self) -> &'static str {
61        match self {
62            Self::Type(_) => "type",
64            Self::DefaultValue(_) => "default_value",
65            Self::Encoding(_) => "encoding",
66            Self::Field(_) => "field",
67            Self::FixedSize(_) => "fixed_size",
68            Self::SizePrefix(_) => "size_prefix",
69
70            Self::Discriminator(_) => "discriminator",
72            Self::EnumDiscriminator(_) => "enum_discriminator",
73            Self::Name(_) => "name",
74
75            Self::Account(_) => "account",
77            Self::Argument(_) => "argument",
78
79            Self::Error(_) => "error",
81        }
82    }
83}