1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
#[derive(Debug, PartialEq, Clone)] pub struct FeatureMetadata { pub id: u64, pub user: String, pub uid: u64, pub version: u32, pub changeset: u64, pub timestamp: String, } #[derive(Debug, PartialEq, Clone)] pub struct Node { pub lat: f64, pub lon: f64, pub metadata: FeatureMetadata, pub tags: Vec<Tag>, } #[derive(Debug, PartialEq, Clone)] pub struct Way { pub nodes: Vec<ReferencedNode>, pub metadata: FeatureMetadata, pub tags: Vec<Tag>, } #[derive(Debug, PartialEq, Clone)] pub struct Relation { pub members: Vec<RelationMember>, pub metadata: FeatureMetadata, pub tags: Vec<Tag>, } #[derive(Debug, PartialEq, Clone)] pub struct ReferencedNode { pub id: i64, } #[derive(Debug, PartialEq, Clone)] pub struct Tag { pub key: String, pub value: String } #[derive(Debug, PartialEq, Clone)] pub enum ReferencedFeature { Node(i64), Way(i64), Relation(i64) } #[derive(Debug, PartialEq, Clone)] pub struct RelationMember { pub role: String, pub feature: ReferencedFeature, } #[derive(Debug, PartialEq, Clone)] pub enum Feature { Node(Node), Way(Way), Relation(Relation), } impl Feature { pub fn metadata(&self) -> &FeatureMetadata { match self { Feature::Node(me) => &me.metadata, Feature::Way(me) => &me.metadata, Feature::Relation(me) => &me.metadata, } } }