model.rs

5.0 kB · rust · 232 lines

1use serde::{Deserialize, Serialize};23pub type Result<T> = std::result::Result<T, String>;45pub const HAND: [&str; 7] = ["Tensor", "Cell", "CellNd", "Cell6d", "Color", "Code", "Rng"];67#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]8pub struct Manifest {9    pub krate: String,10    pub version: String,11    pub modules: Vec<Module>,12    pub types: Vec<Type>,13    pub consts: Vec<Const>,14    pub functions: Vec<Function>,15}1617#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]18pub struct Module {19    pub path: String,20    pub file: String,21    pub docs: Vec<String>,22    pub items: usize,23}2425#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]26pub struct Type {27    pub path: String,28    pub name: String,29    pub defined_at: String,30    pub docs: Vec<String>,31    pub kind: TypeKind,32    pub cross: TypeCross,33    pub derives: Vec<String>,34    pub serde: Vec<String>,35    pub const_generic: bool,36    pub fields: Vec<Field>,37    pub variants: Vec<Variant>,38    pub alias: Option<Ty>,39}4041#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]42#[serde(rename_all = "snake_case")]43pub enum TypeKind {44    Struct,45    Enum,46    Alias,47}4849#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]50#[serde(tag = "kind", rename_all = "snake_case")]51pub enum TypeCross {52    Hand { name: String },53    Class,54    Plain,55    Enum { named: bool, words: Vec<String> },56    Uncrossable { reason: String },57}5859#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]60pub struct Field {61    pub name: String,62    pub public: bool,63    pub docs: Vec<String>,64    pub serde: Vec<String>,65    pub serde_skip: bool,66    pub ty: Ty,67}6869#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]70pub struct Variant {71    pub name: String,72    pub word: Option<String>,73    pub docs: Vec<String>,74    pub serde: Vec<String>,75    pub fields: Vec<Field>,76}7778#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]79pub struct Const {80    pub path: String,81    pub name: String,82    pub defined_at: String,83    pub docs: Vec<String>,84    pub ty: Ty,85    pub cross: Cross,86}8788#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]89pub struct Function {90    pub path: String,91    pub name: String,92    pub module: String,93    pub defined_at: String,94    pub docs: Vec<String>,95    pub owner: Option<String>,96    pub self_kind: Option<SelfKind>,97    pub params: Vec<Param>,98    pub ret: Ty,99    pub dims: Vec<u8>,100    #[serde(rename = "trait")]101    pub via: Option<String>,102    pub source: Source,103    pub constant: bool,104    pub cross: Cross,105}106107#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]108#[serde(rename_all = "snake_case")]109pub enum SelfKind {110    Value,111    Ref,112    Mut,113}114115#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]116pub struct Param {117    pub name: String,118    pub ty: Ty,119}120121#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]122#[serde(rename_all = "snake_case")]123pub enum Source {124    Written,125    NamedEnum,126    Trait,127    Default,128}129130#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]131#[serde(tag = "status", rename_all = "snake_case")]132pub enum Cross {133    Ok,134    Skip { reason: String },135    Private,136}137138#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]139#[serde(tag = "t", rename_all = "snake_case")]140pub enum Ty {141    Unit,142    Scalar {143        name: String,144    },145    Str,146    String,147    U128,148    I128,149    Code,150    Json,151    Vec {152        item: Box<Ty>,153    },154    Slice {155        mutable: bool,156        item: Box<Ty>,157    },158    Option {159        item: Box<Ty>,160    },161    Tuple {162        items: Vec<Ty>,163    },164    Array {165        item: Box<Ty>,166        len: usize,167    },168    Ref {169        mutable: bool,170        lifetime: Option<String>,171        item: Box<Ty>,172    },173    Result {174        item: Box<Ty>,175    },176    Map {177        key: Box<Ty>,178        value: Box<Ty>,179    },180    Set {181        item: Box<Ty>,182    },183    Hand {184        name: String,185        dim: Option<u8>,186    },187    Plain {188        path: String,189    },190    Enum {191        path: String,192    },193    Class {194        path: String,195        dim: Option<u8>,196    },197    Opaque {198        path: String,199    },200    Unknown {201        text: String,202    },203}204205impl Ty {206    pub fn walk(&self, seen: &mut dyn FnMut(&Ty)) {207        seen(self);208        match self {209            Ty::Vec { item }210            | Ty::Slice { item, .. }211            | Ty::Option { item }212            | Ty::Array { item, .. }213            | Ty::Ref { item, .. }214            | Ty::Set { item }215            | Ty::Result { item } => item.walk(seen),216            Ty::Tuple { items } => items.iter().for_each(|t| t.walk(seen)),217            Ty::Map { key, value } => {218                key.walk(seen);219                value.walk(seen);220            }221            _ => {}222        }223    }224    pub fn settable(&self) -> bool {225        !matches!(self, Ty::Ref { .. })226    }227    pub fn any(&self, test: &dyn Fn(&Ty) -> bool) -> bool {228        let mut hit = false;229        self.walk(&mut |t| hit |= test(t));230        hit231    }232}