Skip to main content

gcode_nom/binary/gcode_block/
extractor.rs

1use 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
21/// Extracts gcode block from a binary gcode file.
22///
23/// # Errors
24///
25/// When the parsing fails.
26///
27pub 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            // eof here asserts than what remains is_empty()
39            many_till(gcode_parser, eof),
40        ),
41        |(gcode, _remain)| gcode,
42    )
43    .parse(input)
44}