about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2022-07-27T17·11+0300
committertazjin <tazjin@tvl.su>2022-07-27T21·54+0000
commit7b217bbbe1489840f015411c53d3b31401556b40 (patch)
tree77daa003d58f6b2bad53c5ddbd3afb7f7a7380cd
parentd795a05c0719dd75b67327cb7cfdaaf6aded16dd (diff)
feat(tazjin/predlozhnik): implement logic to restrict inputs r/4326
Change-Id: I3e5a5ba02b5f9fcaeeddb499e243ad3b55cf3d82
Reviewed-on: https://cl.tvl.fyi/c/depot/+/5981
Tested-by: BuildkiteCI
Reviewed-by: tazjin <tazjin@tvl.su>
-rw-r--r--users/tazjin/predlozhnik/src/main.rs70
1 files changed, 62 insertions, 8 deletions
diff --git a/users/tazjin/predlozhnik/src/main.rs b/users/tazjin/predlozhnik/src/main.rs
index ba9eed25cb..bc4df15466 100644
--- a/users/tazjin/predlozhnik/src/main.rs
+++ b/users/tazjin/predlozhnik/src/main.rs
@@ -5,7 +5,7 @@ use maplit::hashmap;
 use std::collections::HashMap;
 use std::fmt::Write;
 
-#[derive(Debug, Hash, PartialEq, Eq)]
+#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq)]
 enum Падеж {
     Именительный,
     Родительный,
@@ -111,18 +111,72 @@ fn example_output() -> String {
     out
 }
 
-struct Model(());
+enum Сообщение {
+    ВыбралПадеж(Option<Падеж>),
+    ВыбралПредлог(Option<&'static str>),
+}
+
+#[derive(Default)]
+struct Модель {
+    падеж: Option<Падеж>,
+    предлог: Option<&'static str>,
+}
 
-impl Component for Model {
-    type Message = ();
+struct Вывод {
+    доступные_падежи: Vec<Падеж>,
+    доступные_предлоги: Vec<&'static str>,
+    объяснение: Option<Html>,
+}
+
+fn объяснить(падеж: Падеж, предлог: &str) -> Html {
+    html! {
+        {"NYI"}
+    }
+}
+
+fn ограничить(м: &Модель) -> Вывод {
+    match (м.падеж, &м.предлог) {
+        (Some(пж), Some(пл)) => Вывод {
+            доступные_падежи: vec![пж],
+            доступные_предлоги: vec![пл],
+            объяснение: Some(объяснить(пж, пл)),
+        },
+
+        (Some(пж), None) => Вывод {
+            доступные_падежи: vec![пж],
+            доступные_предлоги: (*ПО_ПАДЕЖУ)[&пж].clone(),
+            объяснение: None,
+        },
+
+        (None, Some(пл)) => Вывод {
+            доступные_падежи: (*ПО_ПРЕДЛОГУ)[пл].clone(),
+            доступные_предлоги: vec![пл],
+            объяснение: None,
+        },
+
+        (None, None) => Вывод {
+            доступные_падежи: vec![],
+            доступные_предлоги: vec![],
+            объяснение: None,
+        },
+    }
+}
+
+impl Component for Модель {
+    type Message = Сообщение;
     type Properties = ();
 
     fn create(_ctx: &Context<Self>) -> Self {
-        Self(())
+        Default::default()
     }
 
-    fn update(&mut self, _ctx: &Context<Self>, _msg: Self::Message) -> bool {
-        false
+    fn update(&mut self, _ctx: &Context<Self>, msg: Self::Message) -> bool {
+        match msg {
+            Сообщение::ВыбралПадеж(пж) => self.падеж = пж,
+            Сообщение::ВыбралПредлог(пл) => self.предлог = пл,
+        }
+
+        true
     }
 
     fn view(&self, _ctx: &Context<Self>) -> Html {
@@ -133,5 +187,5 @@ impl Component for Model {
 }
 
 fn main() {
-    yew::start_app::<Model>();
+    yew::start_app::<Модель>();
 }