gcode_nom/binary/gcode_block/
extractor.rs

1use nom::{
2    combinator::{eof, map, opt},
3    multi::{many0, many_till},
4    sequence::preceded,
5    IResult, Parser,
6};
7
8use crate::binary::{
9    file_handler::file_header_parser, file_metadata_block::file_metadata_parser,
10    print_metadata_block::print_metadata_parser, printer_metadata_block::printer_metadata_parser,
11    slicer_block::slicer_parser, thumbnail_block::thumbnail_parser, BlockError,
12};
13
14use super::{gcode_parser, GCodeBlock};
15
16/// Extracts gcode block from a binary gcode file.
17///
18/// # Errors
19///
20/// When the parsing fails.
21///
22pub fn extract_gcode(input: &[u8]) -> IResult<&[u8], Vec<GCodeBlock<'_>>, BlockError> {
23    map(
24        preceded(
25            (
26                file_header_parser,
27                opt(file_metadata_parser),
28                printer_metadata_parser,
29                many0(thumbnail_parser),
30                print_metadata_parser,
31                slicer_parser,
32            ),
33            // eof here asserts than what remains is_empty()
34            many_till(gcode_parser, eof),
35        ),
36        |(gcode, _remain)| gcode,
37    )
38    .parse(input)
39}