From 7c67180815575828b1597dcc772d855e88520cff Mon Sep 17 00:00:00 2001 From: Aster Date: Tue, 7 Nov 2023 12:05:46 +0800 Subject: [PATCH] Cast wasm types --- projects/valkyrie-types/Cargo.toml | 1 + .../src/{builtin => atomic}/boolean/mod.rs | 0 .../src/{builtin => atomic}/data_frame/mod.rs | 0 .../{definitions/ids.rs => atomic/id/mod.rs} | 23 ++-- .../src/{builtin => atomic}/images/mod.rs | 0 .../src/{builtin => atomic}/images/readmd.vk | 0 .../src/{builtin => atomic}/json_like/mod.rs | 0 .../src/{builtin => atomic}/list/mod.rs | 0 .../src/{builtin => atomic}/maybe/mod.rs | 4 +- projects/valkyrie-types/src/atomic/mod.rs | 74 +++++++++++++ .../{builtin => atomic}/module_name/mod.rs | 0 .../src/{builtin => atomic}/number/mod.rs | 0 .../src/{builtin => atomic}/primitive/mod.rs | 0 .../src/{builtin => atomic}/result/mod.rs | 0 .../src/{builtin => atomic}/text/mod.rs | 18 +++ projects/valkyrie-types/src/builtin/mod.rs | 73 ------------ .../valkyrie-types/src/builtin/pointer/mod.rs | 15 --- .../{definitions => combine}/classes/mod.rs | 0 .../classes/readme.md | 0 .../{definitions => combine}/fields/mod.rs | 0 .../{definitions => combine}/fields/readme.md | 0 .../interfaces/mod.rs | 0 .../interfaces/readme.md | 0 projects/valkyrie-types/src/combine/mod.rs | 16 +++ .../src/{definitions => combine}/names.rs | 0 .../valkyrie-types/src/combine/unions/mod.rs | 8 ++ .../src/definitions/instances/mod.rs | 1 - .../valkyrie-types/src/definitions/mod.rs | 17 --- projects/valkyrie-types/src/lib.rs | 7 +- projects/valkyrie-types/src/values/mod.rs | 104 +----------------- .../src/values/wasm_abi/maybe.rs | 40 +++++++ .../valkyrie-types/src/values/wasm_abi/mod.rs | 102 +++++++++++++++++ 32 files changed, 279 insertions(+), 224 deletions(-) rename projects/valkyrie-types/src/{builtin => atomic}/boolean/mod.rs (100%) rename projects/valkyrie-types/src/{builtin => atomic}/data_frame/mod.rs (100%) rename projects/valkyrie-types/src/{definitions/ids.rs => atomic/id/mod.rs} (61%) rename projects/valkyrie-types/src/{builtin => atomic}/images/mod.rs (100%) rename projects/valkyrie-types/src/{builtin => atomic}/images/readmd.vk (100%) rename projects/valkyrie-types/src/{builtin => atomic}/json_like/mod.rs (100%) rename projects/valkyrie-types/src/{builtin => atomic}/list/mod.rs (100%) rename projects/valkyrie-types/src/{builtin => atomic}/maybe/mod.rs (91%) create mode 100644 projects/valkyrie-types/src/atomic/mod.rs rename projects/valkyrie-types/src/{builtin => atomic}/module_name/mod.rs (100%) rename projects/valkyrie-types/src/{builtin => atomic}/number/mod.rs (100%) rename projects/valkyrie-types/src/{builtin => atomic}/primitive/mod.rs (100%) rename projects/valkyrie-types/src/{builtin => atomic}/result/mod.rs (100%) rename projects/valkyrie-types/src/{builtin => atomic}/text/mod.rs (55%) delete mode 100644 projects/valkyrie-types/src/builtin/mod.rs delete mode 100644 projects/valkyrie-types/src/builtin/pointer/mod.rs rename projects/valkyrie-types/src/{definitions => combine}/classes/mod.rs (100%) rename projects/valkyrie-types/src/{definitions => combine}/classes/readme.md (100%) rename projects/valkyrie-types/src/{definitions => combine}/fields/mod.rs (100%) rename projects/valkyrie-types/src/{definitions => combine}/fields/readme.md (100%) rename projects/valkyrie-types/src/{definitions => combine}/interfaces/mod.rs (100%) rename projects/valkyrie-types/src/{definitions => combine}/interfaces/readme.md (100%) create mode 100644 projects/valkyrie-types/src/combine/mod.rs rename projects/valkyrie-types/src/{definitions => combine}/names.rs (100%) create mode 100644 projects/valkyrie-types/src/combine/unions/mod.rs delete mode 100644 projects/valkyrie-types/src/definitions/instances/mod.rs delete mode 100644 projects/valkyrie-types/src/definitions/mod.rs create mode 100644 projects/valkyrie-types/src/values/wasm_abi/maybe.rs create mode 100644 projects/valkyrie-types/src/values/wasm_abi/mod.rs diff --git a/projects/valkyrie-types/Cargo.toml b/projects/valkyrie-types/Cargo.toml index 6c67ddd3..cc7c7964 100644 --- a/projects/valkyrie-types/Cargo.toml +++ b/projects/valkyrie-types/Cargo.toml @@ -10,6 +10,7 @@ license = "MPL-2.0" edition = "2021" [dependencies] +pretty-print = "0.1.9" ordered-float = "4.1.1" heck = "0.4.1" serde = "1.0.188" diff --git a/projects/valkyrie-types/src/builtin/boolean/mod.rs b/projects/valkyrie-types/src/atomic/boolean/mod.rs similarity index 100% rename from projects/valkyrie-types/src/builtin/boolean/mod.rs rename to projects/valkyrie-types/src/atomic/boolean/mod.rs diff --git a/projects/valkyrie-types/src/builtin/data_frame/mod.rs b/projects/valkyrie-types/src/atomic/data_frame/mod.rs similarity index 100% rename from projects/valkyrie-types/src/builtin/data_frame/mod.rs rename to projects/valkyrie-types/src/atomic/data_frame/mod.rs diff --git a/projects/valkyrie-types/src/definitions/ids.rs b/projects/valkyrie-types/src/atomic/id/mod.rs similarity index 61% rename from projects/valkyrie-types/src/definitions/ids.rs rename to projects/valkyrie-types/src/atomic/id/mod.rs index 021f4a6e..0a5e7c5d 100644 --- a/projects/valkyrie-types/src/definitions/ids.rs +++ b/projects/valkyrie-types/src/atomic/id/mod.rs @@ -1,21 +1,22 @@ -use shredder::Scan; -use std::fmt::{Debug, Display, Formatter}; +use super::*; +use nyar_error::FileSpan; /// A unique identifier used to query the valkyrie object -#[derive(Clone, PartialEq, Eq, Hash, Scan)] +#[derive(Clone, PartialEq, Eq, Hash)] pub struct ValkyrieID { - path: Vec, + name: Vec, + file: FileSpan, } impl Debug for ValkyrieID { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - f.debug_tuple("ValkyrieID").field(&self.path).finish() + f.debug_tuple("ValkyrieID").field(&self.name).finish() } } impl Display for ValkyrieID { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - f.write_str(&self.path.join("∷")) + f.write_str(&self.name.join("∷")) } } @@ -24,22 +25,22 @@ impl ValkyrieID { where I: IntoIterator, { - Self { path: path.into_iter().collect() } + Self { name: path.into_iter().collect(), file: Default::default() } } pub fn name(&self) -> &str { - match self.path.last() { + match self.name.last() { Some(s) => s.as_str(), None => panic!("Empty namepath"), } } pub fn full_name(&self) -> &[String] { - self.path.as_slice() + self.name.as_slice() } pub fn namespace(&self) -> &[String] { - match self.path.len() { + match self.name.len() { 0 => panic!("Empty namepath"), 1 => &[], - _ => &self.path[0..self.path.len() - 1], + _ => &self.name[0..self.name.len() - 1], } } } diff --git a/projects/valkyrie-types/src/builtin/images/mod.rs b/projects/valkyrie-types/src/atomic/images/mod.rs similarity index 100% rename from projects/valkyrie-types/src/builtin/images/mod.rs rename to projects/valkyrie-types/src/atomic/images/mod.rs diff --git a/projects/valkyrie-types/src/builtin/images/readmd.vk b/projects/valkyrie-types/src/atomic/images/readmd.vk similarity index 100% rename from projects/valkyrie-types/src/builtin/images/readmd.vk rename to projects/valkyrie-types/src/atomic/images/readmd.vk diff --git a/projects/valkyrie-types/src/builtin/json_like/mod.rs b/projects/valkyrie-types/src/atomic/json_like/mod.rs similarity index 100% rename from projects/valkyrie-types/src/builtin/json_like/mod.rs rename to projects/valkyrie-types/src/atomic/json_like/mod.rs diff --git a/projects/valkyrie-types/src/builtin/list/mod.rs b/projects/valkyrie-types/src/atomic/list/mod.rs similarity index 100% rename from projects/valkyrie-types/src/builtin/list/mod.rs rename to projects/valkyrie-types/src/atomic/list/mod.rs diff --git a/projects/valkyrie-types/src/builtin/maybe/mod.rs b/projects/valkyrie-types/src/atomic/maybe/mod.rs similarity index 91% rename from projects/valkyrie-types/src/builtin/maybe/mod.rs rename to projects/valkyrie-types/src/atomic/maybe/mod.rs index d4d229b5..1706a3bf 100644 --- a/projects/valkyrie-types/src/builtin/maybe/mod.rs +++ b/projects/valkyrie-types/src/atomic/maybe/mod.rs @@ -9,13 +9,13 @@ pub struct ValkyrieMaybe { } impl ValkyrieMaybe { - pub fn value(v: V, rhs: ValkyrieType) -> ValkyrieMaybe + pub fn value(v: &V, rhs: ValkyrieType) -> ValkyrieMaybe where V: ValkyrieValueType, { Self { ok: true, value: Some(v.as_valkyrie()), lhs_type: Some(v.as_type()), rhs_type: Some(rhs) } } - pub fn error(v: V, lhs: ValkyrieType) -> ValkyrieMaybe + pub fn error(v: &V, lhs: ValkyrieType) -> ValkyrieMaybe where V: ValkyrieValueType, { diff --git a/projects/valkyrie-types/src/atomic/mod.rs b/projects/valkyrie-types/src/atomic/mod.rs new file mode 100644 index 00000000..84c53d22 --- /dev/null +++ b/projects/valkyrie-types/src/atomic/mod.rs @@ -0,0 +1,74 @@ +// pub mod boolean; +// #[cfg(feature = "polars")] +// pub mod data_frame; +// pub mod images; +// pub mod json_like; +// pub mod list; +// pub mod module_name; +pub mod id; +pub mod maybe; +pub mod text; + +// pub mod primitive; +// pub mod result; + +pub mod boolean; +pub mod number; + +use crate::values::{ValkyrieValue, ValkyrieValueType}; +use std::fmt::{Debug, Display, Formatter}; +// +// use crate::{ +// collection::list::{ValkyrieList, ValkyrieOrdinal}, +// types::ValkyrieMetaType, +// ValkyrieDict, ValkyrieType, ValkyrieValue, +// }; +// use indexmap::IndexMap; +// use shredder::{marker::GcSafe, Gc, Scan, Scanner}; +// use std::{ +// collections::{hash_map::DefaultHasher, BTreeMap, BTreeSet}, +// fmt::{Debug, Formatter}, +// hash::{Hash, Hasher}, +// ops::Not, +// sync::Arc, +// }; +// +/// The display style of a token +pub enum TokenType { + /// A keyword + Keyword, + /// `a, b, c` + Punctuation, + /// `a + b` + Operator, + /// `structure StructureName` + Structure, + /// `class ClassName` + Class, + /// `enumerate EnumerateName` + Enumerate, + /// `union UnionName` + Union, + /// `unite UniteName` + Unite, + /// `variant VariantName` + Variant, + /// `interfaces InterfaceName` + Interface, + /// `trait TraitName` + Trait, + /// `let variable` + Variable, + /// `let mut variable` + VariableMutable, + /// `method(parameter)` + Parameter, + /// `method(mut parameter)` + ParameterMutable, + /// `method(self)` + ParameterSelf, + /// `method(mut self)` + ParameterSelfMutable, + /// `constant` + Constant, +} diff --git a/projects/valkyrie-types/src/builtin/module_name/mod.rs b/projects/valkyrie-types/src/atomic/module_name/mod.rs similarity index 100% rename from projects/valkyrie-types/src/builtin/module_name/mod.rs rename to projects/valkyrie-types/src/atomic/module_name/mod.rs diff --git a/projects/valkyrie-types/src/builtin/number/mod.rs b/projects/valkyrie-types/src/atomic/number/mod.rs similarity index 100% rename from projects/valkyrie-types/src/builtin/number/mod.rs rename to projects/valkyrie-types/src/atomic/number/mod.rs diff --git a/projects/valkyrie-types/src/builtin/primitive/mod.rs b/projects/valkyrie-types/src/atomic/primitive/mod.rs similarity index 100% rename from projects/valkyrie-types/src/builtin/primitive/mod.rs rename to projects/valkyrie-types/src/atomic/primitive/mod.rs diff --git a/projects/valkyrie-types/src/builtin/result/mod.rs b/projects/valkyrie-types/src/atomic/result/mod.rs similarity index 100% rename from projects/valkyrie-types/src/builtin/result/mod.rs rename to projects/valkyrie-types/src/atomic/result/mod.rs diff --git a/projects/valkyrie-types/src/builtin/text/mod.rs b/projects/valkyrie-types/src/atomic/text/mod.rs similarity index 55% rename from projects/valkyrie-types/src/builtin/text/mod.rs rename to projects/valkyrie-types/src/atomic/text/mod.rs index db8c0801..7d911085 100644 --- a/projects/valkyrie-types/src/builtin/text/mod.rs +++ b/projects/valkyrie-types/src/atomic/text/mod.rs @@ -26,3 +26,21 @@ impl ValkyrieValueType for char { ValkyrieType::Text { character: true, encoding: "Unicode" } } } + +impl<'a> ValkyrieValueType for &'a str { + fn as_valkyrie(&self) -> ValkyrieValue { + ValkyrieValue::Text(ValkyrieText { character: false, encoding: "Utf8Text", buffer: self.as_bytes().to_vec() }) + } + fn as_type(&self) -> ValkyrieType { + ValkyrieType::Text { character: false, encoding: "Utf8Text" } + } +} + +impl ValkyrieValueType for String { + fn as_valkyrie(&self) -> ValkyrieValue { + ValkyrieValue::Text(ValkyrieText { character: false, encoding: "Utf8Text", buffer: self.as_bytes().to_vec() }) + } + fn as_type(&self) -> ValkyrieType { + ValkyrieType::Text { character: false, encoding: "Utf8Text" } + } +} diff --git a/projects/valkyrie-types/src/builtin/mod.rs b/projects/valkyrie-types/src/builtin/mod.rs deleted file mode 100644 index 7167943b..00000000 --- a/projects/valkyrie-types/src/builtin/mod.rs +++ /dev/null @@ -1,73 +0,0 @@ -// pub mod boolean; -// #[cfg(feature = "polars")] -// pub mod data_frame; -// pub mod images; -// pub mod json_like; -// pub mod list; -// pub mod module_name; -pub mod maybe; -pub mod text; -// pub mod pointer; -// pub mod primitive; -// pub mod result; -// -pub mod boolean; -pub mod number; - -use crate::values::{ValkyrieValue, ValkyrieValueType}; - -// -// use crate::{ -// collection::list::{ValkyrieList, ValkyrieOrdinal}, -// types::ValkyrieMetaType, -// ValkyrieDict, ValkyrieType, ValkyrieValue, -// }; -// use indexmap::IndexMap; -// use shredder::{marker::GcSafe, Gc, Scan, Scanner}; -// use std::{ -// collections::{hash_map::DefaultHasher, BTreeMap, BTreeSet}, -// fmt::{Debug, Formatter}, -// hash::{Hash, Hasher}, -// ops::Not, -// sync::Arc, -// }; -// -// /// The display style of a token -// pub enum TokenType { -// /// A keyword -// Keyword, -// /// `a, b, c` -// Punctuation, -// /// `a + b` -// Operator, -// /// `structure StructureName` -// Structure, -// /// `class ClassName` -// Class, -// /// `enumerate EnumerateName` -// Enumerate, -// /// `union UnionName` -// Union, -// /// `unite UniteName` -// Unite, -// /// `variant VariantName` -// Variant, -// /// `interfaces InterfaceName` -// Interface, -// /// `trait TraitName` -// Trait, -// /// `let variable` -// Variable, -// /// `let mut variable` -// VariableMutable, -// /// `method(parameter)` -// Parameter, -// /// `method(mut parameter)` -// ParameterMutable, -// /// `method(self)` -// ParameterSelf, -// /// `method(mut self)` -// ParameterSelfMutable, -// /// `constant` -// Constant, -// } diff --git a/projects/valkyrie-types/src/builtin/pointer/mod.rs b/projects/valkyrie-types/src/builtin/pointer/mod.rs deleted file mode 100644 index 71434d3d..00000000 --- a/projects/valkyrie-types/src/builtin/pointer/mod.rs +++ /dev/null @@ -1,15 +0,0 @@ -use super::*; - -impl ValkyrieType for Arc -where - T: ValkyrieType, -{ - #[track_caller] - fn boxed(self) -> ValkyrieValue { - panic!("Gc can't be not boxed") - } - - fn dynamic_type(&self) -> Gc { - self.as_ref().dynamic_type() - } -} diff --git a/projects/valkyrie-types/src/definitions/classes/mod.rs b/projects/valkyrie-types/src/combine/classes/mod.rs similarity index 100% rename from projects/valkyrie-types/src/definitions/classes/mod.rs rename to projects/valkyrie-types/src/combine/classes/mod.rs diff --git a/projects/valkyrie-types/src/definitions/classes/readme.md b/projects/valkyrie-types/src/combine/classes/readme.md similarity index 100% rename from projects/valkyrie-types/src/definitions/classes/readme.md rename to projects/valkyrie-types/src/combine/classes/readme.md diff --git a/projects/valkyrie-types/src/definitions/fields/mod.rs b/projects/valkyrie-types/src/combine/fields/mod.rs similarity index 100% rename from projects/valkyrie-types/src/definitions/fields/mod.rs rename to projects/valkyrie-types/src/combine/fields/mod.rs diff --git a/projects/valkyrie-types/src/definitions/fields/readme.md b/projects/valkyrie-types/src/combine/fields/readme.md similarity index 100% rename from projects/valkyrie-types/src/definitions/fields/readme.md rename to projects/valkyrie-types/src/combine/fields/readme.md diff --git a/projects/valkyrie-types/src/definitions/interfaces/mod.rs b/projects/valkyrie-types/src/combine/interfaces/mod.rs similarity index 100% rename from projects/valkyrie-types/src/definitions/interfaces/mod.rs rename to projects/valkyrie-types/src/combine/interfaces/mod.rs diff --git a/projects/valkyrie-types/src/definitions/interfaces/readme.md b/projects/valkyrie-types/src/combine/interfaces/readme.md similarity index 100% rename from projects/valkyrie-types/src/definitions/interfaces/readme.md rename to projects/valkyrie-types/src/combine/interfaces/readme.md diff --git a/projects/valkyrie-types/src/combine/mod.rs b/projects/valkyrie-types/src/combine/mod.rs new file mode 100644 index 00000000..b5a70d31 --- /dev/null +++ b/projects/valkyrie-types/src/combine/mod.rs @@ -0,0 +1,16 @@ +// use crate::{ +// modifiers::AccessType, +// types::{atomic_type::ValkyrieDocument, ValkyrieMetaType}, +// InitializeType, ValkyrieID, +// }; +// use std::{ +// collections::BTreeMap, +// fmt::{Debug, Formatter}, +// ops::Range, +// }; +// use valkyrie_ast::ExpressionNode; +// pub mod classes; +// pub mod fields; +pub mod unions; +// pub mod interfaces; +// pub mod names; diff --git a/projects/valkyrie-types/src/definitions/names.rs b/projects/valkyrie-types/src/combine/names.rs similarity index 100% rename from projects/valkyrie-types/src/definitions/names.rs rename to projects/valkyrie-types/src/combine/names.rs diff --git a/projects/valkyrie-types/src/combine/unions/mod.rs b/projects/valkyrie-types/src/combine/unions/mod.rs new file mode 100644 index 00000000..b506d65a --- /dev/null +++ b/projects/valkyrie-types/src/combine/unions/mod.rs @@ -0,0 +1,8 @@ +use crate::{ValkyrieID, ValkyrieType}; +use indexmap::IndexMap; +use std::collections::BTreeSet; + +pub struct ValkyrieUnion { + structured: Option, + set: IndexMap, +} diff --git a/projects/valkyrie-types/src/definitions/instances/mod.rs b/projects/valkyrie-types/src/definitions/instances/mod.rs deleted file mode 100644 index 8b137891..00000000 --- a/projects/valkyrie-types/src/definitions/instances/mod.rs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/projects/valkyrie-types/src/definitions/mod.rs b/projects/valkyrie-types/src/definitions/mod.rs deleted file mode 100644 index 168b3867..00000000 --- a/projects/valkyrie-types/src/definitions/mod.rs +++ /dev/null @@ -1,17 +0,0 @@ -use crate::{ - modifiers::AccessType, - types::{atomic_type::ValkyrieDocument, ValkyrieMetaType}, - InitializeType, ValkyrieID, -}; -use std::{ - collections::BTreeMap, - fmt::{Debug, Formatter}, - ops::Range, -}; -use valkyrie_ast::ExpressionNode; -pub mod classes; -pub mod fields; -pub mod ids; -pub mod instances; -pub mod interfaces; -pub mod names; diff --git a/projects/valkyrie-types/src/lib.rs b/projects/valkyrie-types/src/lib.rs index d5268282..7d885eb1 100644 --- a/projects/valkyrie-types/src/lib.rs +++ b/projects/valkyrie-types/src/lib.rs @@ -7,13 +7,13 @@ extern crate core; -mod builtin; +mod atomic; // mod codegen; // mod collection; // mod functions; // mod modifiers; // // #[cfg(test)] -// mod definitions; +mod combine; // mod encoding; // mod singletons; // pub mod testing; @@ -25,7 +25,8 @@ mod values; // pub use crate::{ - builtin::{maybe::ValkyrieMaybe, number::ValkyrieNumber, text::ValkyrieText}, + atomic::{id::ValkyrieID, maybe::ValkyrieMaybe, number::ValkyrieNumber, text::ValkyrieText}, + combine::unions::ValkyrieUnion, values::{ValkyrieType, ValkyrieValue, ValkyrieValueType}, }; // pub use self::{ diff --git a/projects/valkyrie-types/src/values/mod.rs b/projects/valkyrie-types/src/values/mod.rs index 778251b3..38b6b2ac 100644 --- a/projects/valkyrie-types/src/values/mod.rs +++ b/projects/valkyrie-types/src/values/mod.rs @@ -3,7 +3,8 @@ use crate::{ValkyrieMaybe, ValkyrieNumber, ValkyrieText}; use std::rc::Rc; -use wasmtime::component::{types::OptionType, Type, Val}; + +mod wasm_abi; pub trait ValkyrieValueType { fn as_valkyrie(&self) -> ValkyrieValue; @@ -70,104 +71,3 @@ impl ValkyrieValueType for ValkyrieValue { } } } - -impl ValkyrieValueType for Val { - fn as_valkyrie(&self) -> ValkyrieValue { - match self { - Val::Bool(v) => v.as_valkyrie(), - Val::S8(v) => v.as_valkyrie(), - Val::U8(v) => v.as_valkyrie(), - Val::S16(v) => v.as_valkyrie(), - Val::U16(v) => v.as_valkyrie(), - Val::S32(v) => v.as_valkyrie(), - Val::U32(v) => v.as_valkyrie(), - Val::S64(v) => v.as_valkyrie(), - Val::U64(v) => v.as_valkyrie(), - Val::Float32(v) => v.as_valkyrie(), - Val::Float64(v) => v.as_valkyrie(), - Val::Char(v) => v.as_valkyrie(), - Val::String(v) => { - todo!() - } - Val::List(_) => { - todo!() - } - Val::Record(_) => { - todo!() - } - Val::Tuple(_) => { - todo!() - } - Val::Variant(_) => { - todo!() - } - Val::Enum(_) => { - todo!() - } - Val::Option(v) => match v.value() { - Some(s) => ValkyrieMaybe::some(s).as_valkyrie(), - None => ValkyrieMaybe::none(v.ty().ty().as_type()).as_valkyrie(), - }, - Val::Result(v) => todo!(), - Val::Flags(_) => { - todo!() - } - Val::Resource(_) => { - todo!() - } - } - } -} - -impl ValkyrieValueType for Type { - fn as_valkyrie(&self) -> ValkyrieValue { - unreachable!() - } - fn as_type(&self) -> ValkyrieType { - match self { - Type::Bool => ValkyrieType::Boolean, - Type::S8 => ValkyrieType::Integer { sign: true, bits: 8 }, - Type::U8 => ValkyrieType::Integer { sign: false, bits: 8 }, - Type::S16 => ValkyrieType::Integer { sign: true, bits: 16 }, - Type::U16 => ValkyrieType::Integer { sign: false, bits: 16 }, - Type::S32 => ValkyrieType::Integer { sign: true, bits: 32 }, - Type::U32 => ValkyrieType::Integer { sign: false, bits: 32 }, - Type::S64 => ValkyrieType::Integer { sign: true, bits: 64 }, - Type::U64 => ValkyrieType::Integer { sign: false, bits: 64 }, - Type::Float32 => ValkyrieType::Decimal { float: true, bits: 32 }, - Type::Float64 => ValkyrieType::Decimal { float: true, bits: 64 }, - Type::Char => ValkyrieType::Text { character: true, encoding: "Unicode" }, - Type::String => ValkyrieType::Text { character: false, encoding: "Utf8Text" }, - Type::List(_) => { - todo!() - } - Type::Record(_) => { - todo!() - } - Type::Tuple(_) => { - todo!() - } - Type::Variant(_) => { - todo!() - } - Type::Enum(_) => { - todo!() - } - Type::Option(_) => { - todo!() - } - Type::Result(_) => { - todo!() - } - Type::Flags(_) => { - todo!() - } - Type::Own(_) => { - todo!() - } - Type::Borrow(_) => { - todo!() - } - } - } -} diff --git a/projects/valkyrie-types/src/values/wasm_abi/maybe.rs b/projects/valkyrie-types/src/values/wasm_abi/maybe.rs new file mode 100644 index 00000000..3e2fad98 --- /dev/null +++ b/projects/valkyrie-types/src/values/wasm_abi/maybe.rs @@ -0,0 +1,40 @@ +use super::*; + +impl ValkyrieValueType for OptionVal { + fn as_valkyrie(&self) -> ValkyrieValue { + match self.value() { + Some(s) => ValkyrieMaybe::some(s).as_valkyrie(), + None => ValkyrieMaybe::none(self.as_type()).as_valkyrie(), + } + } + fn as_type(&self) -> ValkyrieType { + self.ty().as_type() + } +} + +impl ValkyrieValueType for OptionType { + fn as_valkyrie(&self) -> ValkyrieValue { + unreachable!() + } + fn as_type(&self) -> ValkyrieType { + // FIXME: missing option + self.ty().as_type() + } +} + +impl ValkyrieValueType for ResultVal { + fn as_valkyrie(&self) -> ValkyrieValue { + todo!() + } + fn as_type(&self) -> ValkyrieType { + self.ty().as_type() + } +} +impl ValkyrieValueType for ResultType { + fn as_valkyrie(&self) -> ValkyrieValue { + unreachable!() + } + fn as_type(&self) -> ValkyrieType { + unimplemented!() + } +} diff --git a/projects/valkyrie-types/src/values/wasm_abi/mod.rs b/projects/valkyrie-types/src/values/wasm_abi/mod.rs new file mode 100644 index 00000000..b2d66593 --- /dev/null +++ b/projects/valkyrie-types/src/values/wasm_abi/mod.rs @@ -0,0 +1,102 @@ +use super::*; +use wasmtime::component::{ + types::{OptionType, ResultType}, + OptionVal, ResultVal, Type, Val, +}; +mod maybe; + +impl ValkyrieValueType for Val { + fn as_valkyrie(&self) -> ValkyrieValue { + match self { + Val::Bool(v) => v.as_valkyrie(), + Val::S8(v) => v.as_valkyrie(), + Val::U8(v) => v.as_valkyrie(), + Val::S16(v) => v.as_valkyrie(), + Val::U16(v) => v.as_valkyrie(), + Val::S32(v) => v.as_valkyrie(), + Val::U32(v) => v.as_valkyrie(), + Val::S64(v) => v.as_valkyrie(), + Val::U64(v) => v.as_valkyrie(), + Val::Float32(v) => v.as_valkyrie(), + Val::Float64(v) => v.as_valkyrie(), + Val::Char(v) => v.as_valkyrie(), + Val::String(v) => v.as_ref().as_valkyrie(), + Val::List(_) => { + todo!() + } + Val::Record(_) => { + todo!() + } + Val::Tuple(_) => { + todo!() + } + Val::Variant(_) => { + todo!() + } + Val::Enum(_) => { + todo!() + } + Val::Option(v) => v.as_valkyrie(), + Val::Result(v) => v.as_valkyrie(), + Val::Flags(_) => { + todo!() + } + Val::Resource(_) => { + todo!() + } + } + } +} + +impl ValkyrieValueType for Type { + fn as_valkyrie(&self) -> ValkyrieValue { + unreachable!() + } + fn as_type(&self) -> ValkyrieType { + match self { + Type::Bool => ValkyrieType::Boolean, + Type::S8 => ValkyrieType::Integer { sign: true, bits: 8 }, + Type::U8 => ValkyrieType::Integer { sign: false, bits: 8 }, + Type::S16 => ValkyrieType::Integer { sign: true, bits: 16 }, + Type::U16 => ValkyrieType::Integer { sign: false, bits: 16 }, + Type::S32 => ValkyrieType::Integer { sign: true, bits: 32 }, + Type::U32 => ValkyrieType::Integer { sign: false, bits: 32 }, + Type::S64 => ValkyrieType::Integer { sign: true, bits: 64 }, + Type::U64 => ValkyrieType::Integer { sign: false, bits: 64 }, + Type::Float32 => ValkyrieType::Decimal { float: true, bits: 32 }, + Type::Float64 => ValkyrieType::Decimal { float: true, bits: 64 }, + Type::Char => ValkyrieType::Text { character: true, encoding: "Unicode" }, + Type::String => ValkyrieType::Text { character: false, encoding: "Utf8Text" }, + Type::List(_) => { + todo!() + } + Type::Record(_) => { + todo!() + } + Type::Tuple(_) => { + todo!() + } + Type::Variant(_) => { + todo!() + } + Type::Enum(_) => { + todo!() + } + Type::Option(_) => { + todo!() + } + Type::Result(_) => { + todo!() + } + Type::Flags(_) => { + todo!() + } + Type::Own(_) => { + todo!() + } + Type::Borrow(_) => { + todo!() + } + } + } +}