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}