pub fn program_to_writer(p: &Program, w: &mut dyn Write) -> Result<(), Error>Expand description
Writes an assembled program to a writer in packed, self-describing CBOR (a format MLeM can natively consume.)
Writing to, i.e., a file allows you to save assembled “binaries” that MLeM can execute; you can also pass data over the network for distributed processing.
Examples found in repository?
examples/mlem-asm.rs (line 81)
49fn load_and_process(args: Vec<String>, mode: Mode) {
50 let mut f = BufReader::new(File::open(&args[2]).unwrap());
51 let mut contents = String::new();
52 f.read_to_string(&mut contents).unwrap();
53
54 let mut out: Option<Output> = None;
55 let mut inp: Option<Input> = None;
56
57 match mode {
58 Mode::Assemble => {
59 out = Some(if args.len() == 4 {
60 Output::File(BufWriter::new(File::create(&args[3]).unwrap()))
61 } else {
62 Output::StdOut(BufWriter::new(std::io::stdout()))
63 });
64 },
65 Mode::Execute => {
66 inp = Some(if args.len() == 4 {
67 Input::File(BufReader::new(File::create(&args[3]).unwrap()))
68 } else {
69 Input::StdIn(BufReader::new(std::io::stdin()))
70 });
71 }
72 };
73
74 let result = parse_program(&contents);
75
76 match result {
77 Ok(p) => {
78 match mode {
79 Mode::Assemble => {
80 match out.unwrap() {
81 Output::File(mut o) => { program_to_writer(&p, &mut o).unwrap(); },
82 Output::StdOut(mut o) => { program_to_writer(&p, &mut o).unwrap(); }
83 }
84 },
85 Mode::Execute => {
86 match inp.unwrap() {
87 Input::File(mut i) => {
88 let mut o = std::io::stdout();
89 let mut m = Machine::new(65535, &mut i, &mut o);
90 m.load_program(p);
91 println!("\n{:?}", m.run())
92 },
93 Input::StdIn(mut i) => {
94 let mut o = std::io::stdout();
95 let mut m = Machine::new(65535, &mut i, &mut o);
96 m.load_program(p);
97 println!("\n{:?}", m.run())
98 }
99 }
100 }
101 }
102 }
103 Err(e) => {
104 println!("Could not assemble program.");
105 for error in e {
106 println!("{:2}: {}", error.0, error.1);
107 }
108 std::process::exit(1);
109 }
110 }
111}