gcode_nom/binary/gcode_block/
extractor.rs1use 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
16pub 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 many_till(gcode_parser, eof),
35 ),
36 |(gcode, _remain)| gcode,
37 )
38 .parse(input)
39}