1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
use crate::eval::Env; use crate::objects::{Eval, Object, Vtable}; pub fn instance_vtable() -> Vtable { let vt = Vtable::new("StringOutput"); vt.add_primitive_method_or_panic("print:", string_output_print); vt.add_primitive_method_or_panic("content", string_output_content); vt } pub fn class_vtable() -> Vtable { let vt = Vtable::new("class StringOutput"); vt.add_primitive_method_or_panic("new", class_string_output_new); vt } fn class_string_output_new(_receiver: &Object, _args: &[Object], env: &Env) -> Eval { Ok(env.foo.make_string_output()) } fn string_output_print(receiver: &Object, args: &[Object], _env: &Env) -> Eval { receiver.string_output().write(args[0].string_as_str()); Ok(receiver.clone()) } fn string_output_content(receiver: &Object, _args: &[Object], env: &Env) -> Eval { Ok(env.foo.into_string(receiver.string_output().content())) }