1 个不稳定版本
0.1.0 | 2019年9月25日 |
---|
#2833 在 解析器实现 中
11KB
92 行
CardParse
通过指定结构体中字段属性的数据位置,从一个固定宽度的文本数据源中派生一个允许创建结构体的trait
use cardparse::prelude::*;
static TLE_STRING: &str = r#"ISS (ZARYA)
1 25544U 98067A 08264.51782528 -.00002182 00000-0 -11606-4 0 2927
2 25544 51.6416 247.4627 0006703 130.5360 325.0288 15.72125391563537"#;
#[allow(dead_code)]
#[derive(cardparse::CardParse)]
struct TwoLineElement {
// If end is missing then read to end of line
// but only as far as max - otherwise return
// Err(cardparse::ParseError::SourceTooShort{..})
#[location(line=1,start=1,max=24)]
name: String,
#[location(line=2,start=1,end=1)]
line_number_one: String,
#[location(line=2,start=3,end=7)]
satellite_catalog_number_one: String,
#[location(line=2,start=8,end=8)]
classification: String,
#[location(line=2,start=10,end=11)]
launch_year: String,
#[location(line=2,start=12,end=14)]
launch_number: String,
#[location(line=2,start=15,end=17)]
launch_piece: String,
#[location(line=2,start=19,end=20)]
epoch_year: String,
#[location(line=2,start=21,end=32)]
epoch_day: String,
#[location(line=2,start=34,end=43)]
ballistic_coefficient: String,
#[location(line=2,start=45,end=52)]
second_derivative_of_mean_motion: String,
#[location(line=2,start=54,end=61)]
drag_term: String,
#[location(line=2,start=63,end=63)]
ephemeris_type: String,
#[location(line=2,start=65,end=68)]
element_set_number: String,
#[location(line=2,start=69,end=69)]
check_sum: String,
#[location(line=3,start=01,end=01)]
line_number_two: String,
#[location(line=3,start=03,end=07)]
satellite_catalog_number_two: String,
#[location(line=3,start=09,end=16)]
inclination: String,
#[location(line=3,start=18,end=25)]
right_ascension_of_ascending_node: String,
#[location(line=3,start=27,end=33)]
eccentricity: String,
#[location(line=3,start=35,end=42)]
argument_of_perigee: String,
#[location(line=3,start=44,end=51)]
mean_anomaly: String,
#[location(line=3,start=53,end=63)]
mean_motion: String,
#[location(line=3,start=64,end=68)]
revolution_number_at_epoch: String,
#[location(line=3,start=69,end=69)]
checksum_two: String,
}
fn main() {
let tle = TwoLineElement::cardparse(TLE_STRING).unwrap();
assert_eq!(tle.name, "ISS (ZARYA)");
}
依赖项
~1.1–2.8MB
~50K SLoC