dust/dust-lang/src/abstract_tree/built_in_function_call.rs

81 lines
2.7 KiB
Rust
Raw Normal View History

2024-04-21 22:06:26 +00:00
use std::{io::stdin, thread, time::Duration};
2024-04-21 21:00:08 +00:00
use crate::{
abstract_tree::{Action, Type},
context::Context,
2024-04-21 22:06:26 +00:00
error::{RuntimeError, ValidationError},
value::ValueInner,
Value,
2024-04-21 21:00:08 +00:00
};
2024-04-21 22:06:26 +00:00
use super::{AbstractNode, Expression};
2024-04-21 21:00:08 +00:00
#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]
pub enum BuiltInFunctionCall {
ReadLine,
Sleep(Expression),
WriteLine(Expression),
}
impl AbstractNode for BuiltInFunctionCall {
2024-04-21 22:06:26 +00:00
fn expected_type(&self, _context: &Context) -> Result<Type, ValidationError> {
match self {
BuiltInFunctionCall::ReadLine => Ok(Type::String),
BuiltInFunctionCall::Sleep(_) => Ok(Type::None),
BuiltInFunctionCall::WriteLine(_) => Ok(Type::None),
}
2024-04-21 21:00:08 +00:00
}
2024-04-21 22:06:26 +00:00
fn validate(&self, _context: &Context) -> Result<(), ValidationError> {
match self {
BuiltInFunctionCall::ReadLine => Ok(()),
BuiltInFunctionCall::Sleep(expression) => expression.validate(_context),
BuiltInFunctionCall::WriteLine(expression) => expression.validate(_context),
}
2024-04-21 21:00:08 +00:00
}
fn run(self, context: &mut Context, _clear_variables: bool) -> Result<Action, RuntimeError> {
2024-04-21 22:06:26 +00:00
match self {
BuiltInFunctionCall::ReadLine => {
let mut buffer = String::new();
stdin().read_line(&mut buffer)?;
Ok(Action::Return(Value::string(buffer)))
}
BuiltInFunctionCall::Sleep(expression) => {
let action = expression.clone().run(context, _clear_variables)?;
2024-04-21 22:22:59 +00:00
let value = if let Action::Return(value) = action {
2024-04-21 22:06:26 +00:00
value
} else {
return Err(RuntimeError::ValidationFailure(
ValidationError::InterpreterExpectedReturn(expression.position()),
));
};
2024-04-21 22:22:59 +00:00
if let ValueInner::Integer(milliseconds) = value.inner().as_ref() {
2024-04-21 22:06:26 +00:00
thread::sleep(Duration::from_millis(*milliseconds as u64));
2024-04-21 22:22:59 +00:00
}
2024-04-21 22:06:26 +00:00
2024-04-21 22:22:59 +00:00
Ok(Action::None)
}
BuiltInFunctionCall::WriteLine(expression) => {
let action = expression.clone().run(context, _clear_variables)?;
2024-04-21 22:22:59 +00:00
let value = if let Action::Return(value) = action {
value
2024-04-21 22:06:26 +00:00
} else {
2024-04-21 22:22:59 +00:00
return Err(RuntimeError::ValidationFailure(
ValidationError::InterpreterExpectedReturn(expression.position()),
));
};
if let ValueInner::String(output) = value.inner().as_ref() {
println!("{output}");
2024-04-21 22:06:26 +00:00
}
2024-04-21 22:22:59 +00:00
Ok(Action::None)
2024-04-21 22:06:26 +00:00
}
}
2024-04-21 21:00:08 +00:00
}
}