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 { id: i64, user: String, uid: u64, version: u32, changeset: u64, timestamp: String, } #[derive(Debug, PartialEq, Clone)] pub struct Node { lat: f64, lon: f64, metadata: FeatureMetadata, tags: Vec<Tag>, } #[derive(Debug, PartialEq, Clone)] pub struct Way { nodes: Vec<ReferencedNode>, metadata: FeatureMetadata, tags: Vec<Tag>, } #[derive(Debug, PartialEq, Clone)] pub struct Relation { members: Vec<RelationMember>, metadata: FeatureMetadata, tags: Vec<Tag>, } #[derive(Debug, PartialEq, Clone)] pub struct ReferencedNode { id: i64, } #[derive(Debug, PartialEq, Clone)] pub struct Tag { key: String, value: String } #[derive(Debug, PartialEq, Clone)] pub enum ReferencedFeature { Node(i64), Way(i64), Relation(i64) } #[derive(Debug, PartialEq, Clone)] pub struct RelationMember { role: String, feature: ReferencedFeature, } #[derive(Debug, PartialEq, Clone)] pub enum Feature { Node(Node), Way(Way), Relation(Relation), } impl Feature { fn metadata(&self) -> &FeatureMetadata { match self { Feature::Node(me) => &me.metadata, Feature::Way(me) => &me.metadata, Feature::Relation(me) => &me.metadata, } } }