gcode_nom/binary/gcode_block/
extractor.rs1use nom::IResult;
2use nom::Parser;
3use nom::combinator::eof;
4use nom::combinator::map;
5use nom::combinator::opt;
6use nom::multi::many_till;
7use nom::multi::many0;
8use nom::sequence::preceded;
9
10use crate::binary::BlockError;
11use crate::binary::file_handler::file_header_parser;
12use crate::binary::file_metadata_block::file_metadata_parser;
13use crate::binary::print_metadata_block::print_metadata_parser;
14use crate::binary::printer_metadata_block::printer_metadata_parser;
15use crate::binary::slicer_block::slicer_parser;
16use crate::binary::thumbnail_block::thumbnail_parser;
17
18use super::GCodeBlock;
19use super::gcode_parser;
20
21pub fn extract_gcode(input: &[u8]) -> IResult<&[u8], Vec<GCodeBlock<'_>>, BlockError> {
28 map(
29 preceded(
30 (
31 file_header_parser,
32 opt(file_metadata_parser),
33 printer_metadata_parser,
34 many0(thumbnail_parser),
35 print_metadata_parser,
36 slicer_parser,
37 ),
38 many_till(gcode_parser, eof),
40 ),
41 |(gcode, _remain)| gcode,
42 )
43 .parse(input)
44}