1use std::ops::Range;
2
3use serde::{Serialize, Deserialize};
4
5pub type Span = Range<usize>;
6pub type Spanned<T> = (Span, T);
7
8#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
9pub enum Stmt {
10 SoundChange {
11 source: Spanned<Source>,
12 target: Spanned<Target>,
13 environment: Option<Spanned<Environment>>,
14 description: Option<Spanned<String>>,
15 },
16 Import {
17 path: Vec<Spanned<String>>,
18 absolute: bool,
19 names: Vec<Spanned<String>>,
20 },
21 Language {
22 id: Spanned<String>,
23 parent: Option<Spanned<String>>,
24 name: Option<Spanned<String>>,
25 },
26 Word {
27 gloss: Spanned<String>,
28 pronunciation: Spanned<Vec<String>>,
29 definitions: Vec<Definition>,
30 },
31 Class {
32 label: Spanned<String>,
33 encodes: Vec<Spanned<String>>,
34 annotates: Vec<Spanned<String>>,
35 phonemes: Vec<Spanned<PhonemeDef>>,
36 },
37 Series {
38 label: Spanned<String>,
39 series: Spanned<Series>,
40 },
41 Trait {
42 label: Spanned<String>,
43 members: Vec<Spanned<TraitMember>>,
44 },
45 Milestone {
46 time: Option<Spanned<Time>>,
47 language: Option<Spanned<String>>,
48 }
49}
50
51#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
52pub enum Source {
53 Pattern(Pattern),
54 Empty,
55}
56#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
57pub enum Target {
58 Modification(Vec<Spanned<Feature>>),
59 Pattern(Pattern),
60 Empty,
61}
62
63#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
64pub enum Feature {
65 Positive(String),
66 Negative(String),
67}
68
69pub type Pattern = Vec<Segment>;
70
71#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
72pub enum Segment {
73 Category(Category),
74 Phonemes(String),
75}
76
77#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
78pub struct Category {
79 pub base_class: Option<Spanned<char>>,
80 pub features: Vec<Spanned<Feature>>,
81}
82
83#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
84pub struct Environment {
85 pub before: Option<EnvPattern>,
86 pub after: Option<EnvPattern>,
87}
88
89pub type EnvPattern = Vec<EnvElement>;
90
91#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
92pub enum EnvElement {
93 Segment(Segment),
94 SyllableBoundary,
95 WordBoundary,
96}
97
98#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
99pub struct Definition {
100 pub pos: Option<Spanned<String>>,
101 pub definition: Spanned<String>,
102}
103
104#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
105pub enum Series {
106 Category(Category),
107 List(Vec<Spanned<String>>),
108}
109
110#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
111pub struct PhonemeDef {
112 pub label: Spanned<String>,
113 pub traits: Vec<Spanned<String>>,
114}
115
116#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
117pub struct TraitMember {
118 pub labels: Vec<Spanned<String>>,
119 pub notation: Option<Spanned<String>>,
120 pub default: bool,
121}
122
123#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
124pub enum Time {
125 Instant(i64),
126 Range(i64, i64),
127}
128