1use std::fmt;
8
9#[derive(Debug, Clone, PartialEq)]
11pub enum Setting {
12 Real(f64),
14 Int(i64),
16 Choice(String),
18}
19
20impl fmt::Display for Setting {
21 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
22 match self {
23 Self::Real(value) => write!(f, "{value}"),
24 Self::Int(value) => write!(f, "{value}"),
25 Self::Choice(option) => f.write_str(option),
26 }
27 }
28}
29
30#[derive(Debug, Clone, PartialEq)]
32pub struct Point {
33 settings: Vec<(String, Setting)>,
34}
35
36impl Point {
37 pub fn of(settings: Vec<(String, Setting)>) -> Self {
39 Self { settings }
40 }
41
42 pub fn get(&self, name: &str) -> Option<&Setting> {
44 self.settings
45 .iter()
46 .find(|(taken, _)| taken == name)
47 .map(|(_, setting)| setting)
48 }
49
50 pub fn settings(&self) -> &[(String, Setting)] {
52 &self.settings
53 }
54
55 pub fn len(&self) -> usize {
57 self.settings.len()
58 }
59
60 pub fn is_empty(&self) -> bool {
62 self.settings.is_empty()
63 }
64}
65
66impl fmt::Display for Point {
67 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
68 let said: Vec<String> = self
69 .settings
70 .iter()
71 .map(|(name, setting)| format!("{name}={setting}"))
72 .collect();
73 f.write_str(&said.join(","))
74 }
75}