model.rs

5.0 kB · rust · 234 lines

1use serde::{Deserialize, Serialize};23pub type Result<T> = std::result::Result<T, String>;45pub const HAND: [&str; 8] = [6    "Tensor", "Cell", "CellNd", "Cell6d", "Image", "Color", "Code", "Rng",7];89#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]10pub struct Manifest {11    pub krate: String,12    pub version: String,13    pub modules: Vec<Module>,14    pub types: Vec<Type>,15    pub consts: Vec<Const>,16    pub functions: Vec<Function>,17}1819#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]20pub struct Module {21    pub path: String,22    pub file: String,23    pub docs: Vec<String>,24    pub items: usize,25}2627#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]28pub struct Type {29    pub path: String,30    pub name: String,31    pub defined_at: String,32    pub docs: Vec<String>,33    pub kind: TypeKind,34    pub cross: TypeCross,35    pub derives: Vec<String>,36    pub serde: Vec<String>,37    pub const_generic: bool,38    pub fields: Vec<Field>,39    pub variants: Vec<Variant>,40    pub alias: Option<Ty>,41}4243#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]44#[serde(rename_all = "snake_case")]45pub enum TypeKind {46    Struct,47    Enum,48    Alias,49}5051#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]52#[serde(tag = "kind", rename_all = "snake_case")]53pub enum TypeCross {54    Hand { name: String },55    Class,56    Plain,57    Enum { named: bool, words: Vec<String> },58    Uncrossable { reason: String },59}6061#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]62pub struct Field {63    pub name: String,64    pub public: bool,65    pub docs: Vec<String>,66    pub serde: Vec<String>,67    pub serde_skip: bool,68    pub ty: Ty,69}7071#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]72pub struct Variant {73    pub name: String,74    pub word: Option<String>,75    pub docs: Vec<String>,76    pub serde: Vec<String>,77    pub fields: Vec<Field>,78}7980#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]81pub struct Const {82    pub path: String,83    pub name: String,84    pub defined_at: String,85    pub docs: Vec<String>,86    pub ty: Ty,87    pub cross: Cross,88}8990#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]91pub struct Function {92    pub path: String,93    pub name: String,94    pub module: String,95    pub defined_at: String,96    pub docs: Vec<String>,97    pub owner: Option<String>,98    pub self_kind: Option<SelfKind>,99    pub params: Vec<Param>,100    pub ret: Ty,101    pub dims: Vec<u8>,102    #[serde(rename = "trait")]103    pub via: Option<String>,104    pub source: Source,105    pub constant: bool,106    pub cross: Cross,107}108109#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]110#[serde(rename_all = "snake_case")]111pub enum SelfKind {112    Value,113    Ref,114    Mut,115}116117#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]118pub struct Param {119    pub name: String,120    pub ty: Ty,121}122123#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]124#[serde(rename_all = "snake_case")]125pub enum Source {126    Written,127    NamedEnum,128    Trait,129    Default,130}131132#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]133#[serde(tag = "status", rename_all = "snake_case")]134pub enum Cross {135    Ok,136    Skip { reason: String },137    Private,138}139140#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]141#[serde(tag = "t", rename_all = "snake_case")]142pub enum Ty {143    Unit,144    Scalar {145        name: String,146    },147    Str,148    String,149    U128,150    I128,151    Code,152    Json,153    Vec {154        item: Box<Ty>,155    },156    Slice {157        mutable: bool,158        item: Box<Ty>,159    },160    Option {161        item: Box<Ty>,162    },163    Tuple {164        items: Vec<Ty>,165    },166    Array {167        item: Box<Ty>,168        len: usize,169    },170    Ref {171        mutable: bool,172        lifetime: Option<String>,173        item: Box<Ty>,174    },175    Result {176        item: Box<Ty>,177    },178    Map {179        key: Box<Ty>,180        value: Box<Ty>,181    },182    Set {183        item: Box<Ty>,184    },185    Hand {186        name: String,187        dim: Option<u8>,188    },189    Plain {190        path: String,191    },192    Enum {193        path: String,194    },195    Class {196        path: String,197        dim: Option<u8>,198    },199    Opaque {200        path: String,201    },202    Unknown {203        text: String,204    },205}206207impl Ty {208    pub fn walk(&self, seen: &mut dyn FnMut(&Ty)) {209        seen(self);210        match self {211            Ty::Vec { item }212            | Ty::Slice { item, .. }213            | Ty::Option { item }214            | Ty::Array { item, .. }215            | Ty::Ref { item, .. }216            | Ty::Set { item }217            | Ty::Result { item } => item.walk(seen),218            Ty::Tuple { items } => items.iter().for_each(|t| t.walk(seen)),219            Ty::Map { key, value } => {220                key.walk(seen);221                value.walk(seen);222            }223            _ => {}224        }225    }226    pub fn settable(&self) -> bool {227        !matches!(self, Ty::Ref { .. })228    }229    pub fn any(&self, test: &dyn Fn(&Ty) -> bool) -> bool {230        let mut hit = false;231        self.walk(&mut |t| hit |= test(t));232        hit233    }234}