From 7b217bbbe1489840f015411c53d3b31401556b40 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Wed, 27 Jul 2022 20:11:02 +0300 Subject: feat(tazjin/predlozhnik): implement logic to restrict inputs Change-Id: I3e5a5ba02b5f9fcaeeddb499e243ad3b55cf3d82 Reviewed-on: https://cl.tvl.fyi/c/depot/+/5981 Tested-by: BuildkiteCI Reviewed-by: tazjin --- users/tazjin/predlozhnik/src/main.rs | 70 +++++++++++++++++++++++++++++++----- 1 file changed, 62 insertions(+), 8 deletions(-) (limited to 'users/tazjin/predlozhnik') diff --git a/users/tazjin/predlozhnik/src/main.rs b/users/tazjin/predlozhnik/src/main.rs index ba9eed25cbbd..bc4df154662a 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, +} + +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(()) + Default::default() } - fn update(&mut self, _ctx: &Context, _msg: Self::Message) -> bool { - false + fn update(&mut self, _ctx: &Context, msg: Self::Message) -> bool { + match msg { + Сообщение::ВыбралПадеж(пж) => self.падеж = пж, + Сообщение::ВыбралПредлог(пл) => self.предлог = пл, + } + + true } fn view(&self, _ctx: &Context) -> Html { @@ -133,5 +187,5 @@ impl Component for Model { } fn main() { - yew::start_app::(); + yew::start_app::<Модель>(); } -- cgit 1.4.1