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()))
}