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}