use anyhow::{bail, Result};
#[derive(Debug)]
pub(crate) enum PointDataType {
Skip,
CoordinateX,
CoordinateY,
CoordinateZ, Intensity, ReturnNumber, NumberOfReturns, Classification, UserData, ColorR, ColorG, ColorB, GpsTime, PointSourceID, EdgeOfFlightLine, ScanDirectionFlag, ScanAngleRank, Nir, }
impl std::fmt::Display for PointDataType {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{:?}", self)
}
}
impl PointDataType {
pub(crate) fn get_parse_layout(format: &str) -> Result<Vec<PointDataType>> {
let mut parse_layout = Vec::<PointDataType>::new();
for character in format.chars() {
match character {
's' => parse_layout.push(PointDataType::Skip),
'x' => parse_layout.push(PointDataType::CoordinateX),
'y' => parse_layout.push(PointDataType::CoordinateY),
'z' => parse_layout.push(PointDataType::CoordinateZ),
'i' => parse_layout.push(PointDataType::Intensity),
'n' => parse_layout.push(PointDataType::NumberOfReturns),
'r' => parse_layout.push(PointDataType::ReturnNumber),
'c' => parse_layout.push(PointDataType::Classification),
't' => parse_layout.push(PointDataType::GpsTime),
'u' => parse_layout.push(PointDataType::UserData),
'p' => parse_layout.push(PointDataType::PointSourceID),
'R' => parse_layout.push(PointDataType::ColorR),
'G' => parse_layout.push(PointDataType::ColorG),
'B' => parse_layout.push(PointDataType::ColorB),
'I' => parse_layout.push(PointDataType::Nir),
'a' => parse_layout.push(PointDataType::ScanAngleRank),
'e' => parse_layout.push(PointDataType::EdgeOfFlightLine),
'd' => parse_layout.push(PointDataType::ScanDirectionFlag),
_ => {
bail!(
"FormatError can't interpret format literal '{}' in format string '{}'.",
character,
format
);
}
}
}
Ok(parse_layout)
}
}