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
74
75
mod data;
use data::{CONJUNCTIONS, TEMPLATES, WORDS};
use rand::prelude::{SliceRandom, ThreadRng};
use std::fmt::{Display, Formatter, Result};
use super::DsMulti;
struct Segment { main: &'static str, word: &'static str }
impl Segment {
pub fn random(rng: &mut ThreadRng) -> Self {
Self {
main: TEMPLATES.choose(rng).unwrap(),
word: WORDS.choose(rng).unwrap(),
}
}
}
impl Display for Segment {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
if self.main == "\x1F" {
self.word.fmt(f)
} else {
match self.main.find('\x1F') {
Some(i) => write!(
f, "{}{}{}",
&self.main[..i], &self.word, &self.main[i + 1..],
),
None => self.main.fmt(f),
}
}
}
}
pub struct MessageDkS3 {
p1: Segment,
p2: Option<(&'static str, Segment)>,
}
impl DsMulti for MessageDkS3 {
fn double(rng: &mut ThreadRng) -> Self {
Self {
p1: Segment::random(rng),
p2: Some((CONJUNCTIONS.choose(rng).unwrap(), Segment::random(rng))),
}
}
fn single(rng: &mut ThreadRng) -> Self {
Self {
p1: Segment::random(rng),
p2: None,
}
}
}
impl Display for MessageDkS3 {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
match &self.p2 {
Some((conj, second)) => write!(f, "{}{}{}", &self.p1, conj, second),
None => self.p1.fmt(f),
}
}
}