1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
use serde::{Deserialize, Serialize}; use std::collections::HashMap; #[derive(Debug, Serialize, Deserialize)] pub struct IgniteTypeDefinition { pub namespace: Option<String>, #[serde(default, skip_serializing_if = "Vec::is_empty")] pub generic_args: Vec<String>, pub variant: IgniteTypeVariant, #[serde(default, skip_serializing_if = "HashMap::is_empty")] pub meta: HashMap<String, IgniteAttribMeta>, } #[derive(Debug, Serialize, Deserialize)] pub enum IgniteTypeVariant { StructUnit(String), StructNamed(IgniteNamed), StructUnnamed(IgniteUnnamed), Enum(IgniteEnum), } #[derive(Debug, Serialize, Deserialize)] pub struct IgniteNamed { pub name: String, #[serde(default, skip_serializing_if = "Vec::is_empty")] pub fields: Vec<IgniteNamedField>, } #[derive(Debug, Serialize, Deserialize)] pub struct IgniteUnnamed { pub name: String, #[serde(default, skip_serializing_if = "Vec::is_empty")] pub fields: Vec<IgniteUnnamedField>, } #[derive(Debug, Serialize, Deserialize)] pub struct IgniteNamedField { pub name: String, pub typename: IgniteType, #[serde(default, skip_serializing_if = "Option::is_none")] pub mapping: Option<String>, #[serde(default, skip_serializing_if = "HashMap::is_empty")] pub meta: HashMap<String, IgniteAttribMeta>, } #[derive(Debug, Serialize, Deserialize)] pub struct IgniteUnnamedField { pub typename: IgniteType, #[serde(default, skip_serializing_if = "Option::is_none")] pub mapping: Option<String>, #[serde(default, skip_serializing_if = "HashMap::is_empty")] pub meta: HashMap<String, IgniteAttribMeta>, } #[derive(Debug, Serialize, Deserialize)] pub struct IgniteEnum { pub name: String, #[serde(default, skip_serializing_if = "Vec::is_empty")] pub variants: Vec<IgniteVariant>, } #[derive(Debug, Serialize, Deserialize)] pub enum IgniteVariant { Unit(String), Named(IgniteNamed), Unnamed(IgniteUnnamed), } #[derive(Debug, Serialize, Deserialize)] pub enum IgniteType { Unit, Atom(String), Tuple(Vec<IgniteType>), Array(IgniteTypeArray), Generic(IgniteTypeGeneric), } #[derive(Debug, Serialize, Deserialize)] pub struct IgniteTypeArray { pub typename: Box<IgniteType>, pub size: usize, } #[derive(Debug, Serialize, Deserialize)] pub struct IgniteTypeGeneric { pub name: String, #[serde(default, skip_serializing_if = "Vec::is_empty")] pub arguments: Vec<IgniteType>, } #[derive(Debug, Serialize, Deserialize)] pub enum IgniteAttribMeta { None, Bool(bool), String(String), Integer(i64), Float(f64), } impl Default for IgniteAttribMeta { fn default() -> Self { Self::None } } pub trait Ignite { fn generate_type_definition() -> IgniteTypeDefinition; }