use crate::{
AccountDirective, ArgumentDirective, AttributeContext, DefaultValueDirective,
DiscriminatorDirective, EncodingDirective, EnumDiscriminatorDirective, ErrorDirective,
FieldDirective, FixedSizeDirective, NameDirective, OptionalAccountStrategyDirective,
PdaDirective, ProgramDirective, SeedDirective, SizePrefixDirective, SkipDirective,
TypeDirective,
};
use codama_syn_helpers::{extensions::*, Meta};
use derive_more::derive::From;
#[derive(Debug, PartialEq, From)]
pub enum CodamaDirective {
Type(TypeDirective),
Encoding(EncodingDirective),
Field(FieldDirective),
FixedSize(FixedSizeDirective),
SizePrefix(SizePrefixDirective),
DefaultValue(DefaultValueDirective),
Discriminator(DiscriminatorDirective),
EnumDiscriminator(EnumDiscriminatorDirective),
Name(NameDirective),
OptionalAccountStrategy(OptionalAccountStrategyDirective),
Program(ProgramDirective),
Seed(SeedDirective),
Skip(SkipDirective),
Pda(PdaDirective),
Account(AccountDirective),
Argument(ArgumentDirective),
Error(ErrorDirective),
}
impl CodamaDirective {
pub fn parse(meta: &Meta, ctx: &AttributeContext) -> syn::Result<Self> {
let path = meta.path()?;
match path.to_string().as_str() {
"type" => Ok(TypeDirective::parse(meta)?.into()),
"encoding" => Ok(EncodingDirective::parse(meta)?.into()),
"field" => Ok(FieldDirective::parse(meta)?.into()),
"fixed_size" => Ok(FixedSizeDirective::parse(meta)?.into()),
"size_prefix" => Ok(SizePrefixDirective::parse(meta)?.into()),
"default_value" => Ok(DefaultValueDirective::parse(meta)?.into()),
"value" => Ok(DefaultValueDirective::parse(meta)?.into()),
"discriminator" => Ok(DiscriminatorDirective::parse(meta)?.into()),
"enum_discriminator" => Ok(EnumDiscriminatorDirective::parse(meta)?.into()),
"name" => Ok(NameDirective::parse(meta)?.into()),
"optional_account_strategy" => {
Ok(OptionalAccountStrategyDirective::parse(meta)?.into())
}
"program" => Ok(ProgramDirective::parse(meta)?.into()),
"seed" => Ok(SeedDirective::parse(meta, ctx)?.into()),
"skip" => Ok(SkipDirective::parse(meta)?.into()),
"pda" => Ok(PdaDirective::parse(meta)?.into()),
"account" => Ok(AccountDirective::parse(meta, ctx)?.into()),
"argument" => Ok(ArgumentDirective::parse(meta)?.into()),
"error" => Ok(ErrorDirective::parse(meta)?.into()),
_ => Err(path.error("unrecognized codama directive")),
}
}
pub fn name(&self) -> &'static str {
match self {
Self::Type(_) => "type",
Self::Encoding(_) => "encoding",
Self::Field(_) => "field",
Self::FixedSize(_) => "fixed_size",
Self::SizePrefix(_) => "size_prefix",
Self::DefaultValue(_) => "default_value | value",
Self::Discriminator(_) => "discriminator",
Self::EnumDiscriminator(_) => "enum_discriminator",
Self::Name(_) => "name",
Self::OptionalAccountStrategy(_) => "optional_account_strategy",
Self::Program(_) => "program",
Self::Seed(_) => "seed",
Self::Skip(_) => "skip",
Self::Pda(_) => "pda",
Self::Account(_) => "account",
Self::Argument(_) => "argument",
Self::Error(_) => "error",
}
}
}