lf2_parse 0.1.0

Parses Little Fighter 2 (LF2) data files
Documentation
use std::{convert::TryFrom, path::PathBuf};

use pest::iterators::Pair;

use crate::{Error, ObjectDataParser, Rule, SubRuleFn};

#[derive(Clone, Debug, Default, PartialEq)]
pub struct SpriteFile {
    path: PathBuf,
    w: u32,
    h: u32,
    row: u32,
    col: u32,
}

impl SpriteFile {
    fn parse_path<'i>(
        sprite_file: SpriteFile,
        path_pair: Pair<'i, Rule>,
    ) -> Result<SpriteFile, Error<'i>> {
        ObjectDataParser::parse_as_type(
            sprite_file,
            path_pair,
            Rule::TagFileValue,
            &[Self::parse_path_value as SubRuleFn<_>],
        )
    }

    fn parse_path_value<'i>(
        mut sprite_file: SpriteFile,
        value_pair: Pair<'i, Rule>,
    ) -> Result<SpriteFile, Error<'i>> {
        let path = value_pair.as_str().parse().map_err(|_| Error::ParsePath {
            field: stringify!(path),
            value_pair,
        })?;
        sprite_file.path = path;
        Ok(sprite_file)
    }

    fn parse_w<'i>(
        sprite_file: SpriteFile,
        w_pair: Pair<'i, Rule>,
    ) -> Result<SpriteFile, Error<'i>> {
        ObjectDataParser::parse_as_type(
            sprite_file,
            w_pair,
            Rule::TagW,
            &[Self::parse_w_value as SubRuleFn<_>],
        )
    }

    fn parse_w_value<'i>(
        mut sprite_file: SpriteFile,
        value_pair: Pair<'i, Rule>,
    ) -> Result<SpriteFile, Error<'i>> {
        let w = value_pair
            .as_str()
            .parse()
            .map_err(|error| Error::ParseInt {
                field: stringify!(w),
                value_pair,
                error,
            })?;
        sprite_file.w = w;
        Ok(sprite_file)
    }

    fn parse_h<'i>(
        sprite_file: SpriteFile,
        h_pair: Pair<'i, Rule>,
    ) -> Result<SpriteFile, Error<'i>> {
        ObjectDataParser::parse_as_type(
            sprite_file,
            h_pair,
            Rule::TagH,
            &[Self::parse_h_value as SubRuleFn<_>],
        )
    }

    fn parse_h_value<'i>(
        mut sprite_file: SpriteFile,
        value_pair: Pair<'i, Rule>,
    ) -> Result<SpriteFile, Error<'i>> {
        let h = value_pair
            .as_str()
            .parse()
            .map_err(|error| Error::ParseInt {
                field: stringify!(h),
                value_pair,
                error,
            })?;
        sprite_file.h = h;
        Ok(sprite_file)
    }

    fn parse_row<'i>(
        sprite_file: SpriteFile,
        row_pair: Pair<'i, Rule>,
    ) -> Result<SpriteFile, Error<'i>> {
        ObjectDataParser::parse_as_type(
            sprite_file,
            row_pair,
            Rule::TagRow,
            &[Self::parse_row_value as SubRuleFn<_>],
        )
    }

    fn parse_row_value<'i>(
        mut sprite_file: SpriteFile,
        value_pair: Pair<'i, Rule>,
    ) -> Result<SpriteFile, Error<'i>> {
        let row = value_pair
            .as_str()
            .parse()
            .map_err(|error| Error::ParseInt {
                field: stringify!(row),
                value_pair,
                error,
            })?;
        sprite_file.row = row;
        Ok(sprite_file)
    }

    fn parse_col<'i>(
        sprite_file: SpriteFile,
        col_pair: Pair<'i, Rule>,
    ) -> Result<SpriteFile, Error<'i>> {
        ObjectDataParser::parse_as_type(
            sprite_file,
            col_pair,
            Rule::TagCol,
            &[Self::parse_col_value as SubRuleFn<_>],
        )
    }

    fn parse_col_value<'i>(
        mut sprite_file: SpriteFile,
        value_pair: Pair<'i, Rule>,
    ) -> Result<SpriteFile, Error<'i>> {
        let col = value_pair
            .as_str()
            .parse()
            .map_err(|error| Error::ParseInt {
                field: stringify!(col),
                value_pair,
                error,
            })?;
        sprite_file.col = col;
        Ok(sprite_file)
    }
}

impl<'i> TryFrom<Pair<'i, Rule>> for SpriteFile {
    type Error = Error<'i>;

    fn try_from(pair: Pair<'i, Rule>) -> Result<Self, Self::Error> {
        ObjectDataParser::parse_as_type(
            SpriteFile::default(),
            pair,
            Rule::SpriteFile,
            &[
                Self::parse_path,
                Self::parse_w,
                Self::parse_h,
                Self::parse_row,
                Self::parse_col,
            ],
        )
    }
}