Implement Result type

This commit is contained in:
Jeff 2024-02-15 02:08:42 -05:00
parent ed1f139595
commit b8f2fe7eb4
2 changed files with 26 additions and 1 deletions

View File

@ -5,6 +5,7 @@ use enum_iterator::{all, Sequence};
use crate::{EnumDefinition, Identifier, Type, TypeDefinition, VariantContent}; use crate::{EnumDefinition, Identifier, Type, TypeDefinition, VariantContent};
static OPTION: OnceLock<TypeDefinition> = OnceLock::new(); static OPTION: OnceLock<TypeDefinition> = OnceLock::new();
static RESULT: OnceLock<TypeDefinition> = OnceLock::new();
pub fn all_built_in_type_definitions() -> impl Iterator<Item = BuiltInTypeDefinition> { pub fn all_built_in_type_definitions() -> impl Iterator<Item = BuiltInTypeDefinition> {
all() all()
@ -13,12 +14,14 @@ pub fn all_built_in_type_definitions() -> impl Iterator<Item = BuiltInTypeDefini
#[derive(Sequence)] #[derive(Sequence)]
pub enum BuiltInTypeDefinition { pub enum BuiltInTypeDefinition {
Option, Option,
Result,
} }
impl BuiltInTypeDefinition { impl BuiltInTypeDefinition {
pub fn name(&self) -> &'static str { pub fn name(&self) -> &'static str {
match self { match self {
BuiltInTypeDefinition::Option => "Option", BuiltInTypeDefinition::Option => "Option",
BuiltInTypeDefinition::Result => "Result",
} }
} }
@ -26,13 +29,22 @@ impl BuiltInTypeDefinition {
match self { match self {
BuiltInTypeDefinition::Option => OPTION.get_or_init(|| { BuiltInTypeDefinition::Option => OPTION.get_or_init(|| {
TypeDefinition::Enum(EnumDefinition::new( TypeDefinition::Enum(EnumDefinition::new(
Identifier::new("Option"), Identifier::new(self.name()),
vec![ vec![
(Identifier::new("Some"), VariantContent::Type(Type::Any)), (Identifier::new("Some"), VariantContent::Type(Type::Any)),
(Identifier::new("None"), VariantContent::None), (Identifier::new("None"), VariantContent::None),
], ],
)) ))
}), }),
BuiltInTypeDefinition::Result => RESULT.get_or_init(|| {
TypeDefinition::Enum(EnumDefinition::new(
Identifier::new(self.name()),
vec![
(Identifier::new("Ok"), VariantContent::Type(Type::Any)),
(Identifier::new("Err"), VariantContent::Type(Type::Any)),
],
))
}),
} }
} }
} }

View File

@ -36,4 +36,17 @@ fn result() {
Value::Integer(1) Value::Integer(1)
))) )))
); );
assert_eq!(
interpret(
"
result = new Result:Error('uh-oh!')
result
"
),
Ok(Value::Enum(EnumInstance::new(
"Result".to_string(),
"Error".to_string(),
Value::String("uh-oh!".to_string())
)))
);
} }