Skip to content

Commit c03b2e2

Browse files
committed
fallback to if guard if cannot use match
1 parent 35cf971 commit c03b2e2

File tree

5 files changed

+575
-195
lines changed

5 files changed

+575
-195
lines changed

src/convert/_build.rs

Lines changed: 37 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ pub fn {{from | lower}}_to_{{to | lower}}(value: {{from}}) -> Option<{{to}}> {
8080
{% if let Some(attr) = entry.attr_v -%}
8181
{{ attr | indent(4) }}
8282
{% endif -%}
83-
{{ entry.k | pad_right(*k_len) }} => {{ entry.v | pad_right(*v_len) | apply_expr(&value_expr) }},
83+
{{ entry.k | pad_right(*k_len) | apply_expr(key_expr) }} => {{ entry.v | pad_right(*v_len) | apply_expr(value_expr) }},
8484
{% endfor -%}
8585
_ => return None,
8686
};
@@ -96,18 +96,21 @@ impl crate::convert::Convert<{{from}}, {{to}}> for crate::convert::Converter {
9696
pub struct ConvertImplTemplate<'a> {
9797
pub from: &'a str,
9898
pub to: &'a str,
99+
pub key_expr: RustExpr,
99100
pub value_expr: RustExpr,
100101
pub entries: Vec<Entry<'a, Cow<'a, str>>>,
101102
pub k_len: usize,
102103
pub v_len: usize,
103104
}
104105

105106
impl<'a> ConvertImplTemplate<'a> {
106-
pub fn create(from: &'a str, to: &'a str, value_expr: Option<RustExpr>) -> Self {
107-
let value_expr = value_expr.unwrap_or(RustExpr("{}"));
107+
pub fn create(from: &'a str, to: &'a str, key_expr: Option<RustExpr>, value_expr: Option<RustExpr>) -> Self {
108+
let value_expr = value_expr.unwrap_or_else(RustExpr::default);
109+
let key_expr = key_expr.unwrap_or_else(RustExpr::default);
108110
Self {
109111
from,
110112
to,
113+
key_expr,
111114
value_expr,
112115
entries: vec![],
113116
k_len: 0,
@@ -236,7 +239,7 @@ pub struct AsCodeImplTemplate<'a> {
236239
}
237240
impl<'a> AsCodeImplTemplate<'a> {
238241
pub fn create(from: &'a str, to: KeyCodeInfo, value_expr: Option<RustExpr>) -> Self {
239-
let value_expr = value_expr.unwrap_or(RustExpr("{}"));
242+
let value_expr = value_expr.unwrap_or_else(RustExpr::default);
240243
Self {
241244
ty: from,
242245
code: to,
@@ -349,12 +352,19 @@ impl KeyType {
349352
}.into()
350353
}
351354

355+
pub fn as_key_expr(self) -> Option<RustExpr> {
356+
match (self, self.as_value_expr()) {
357+
(KeyType::HUT, Some(v)) | (KeyType::WinVk, Some(v)) => Some(RustExpr::new(format!("k if k == {}", v.0))),
358+
(_, v) => v,
359+
}
360+
}
361+
352362
pub fn as_value_expr(self) -> Option<RustExpr> {
353363
match self {
354-
KeyType::HUT => Some(RustExpr("{}.usage()")),
355-
KeyType::WinVk => Some(RustExpr("keys::{}")),
356-
KeyType::CG => Some(RustExpr("CGKeyCode( {} )")),
357-
KeyType::WinScan => Some(RustExpr("Make1Code( {} )")),
364+
KeyType::HUT => Some(RustExpr::new("{}.usage()")),
365+
KeyType::WinVk => Some(RustExpr::new("keys::{}")),
366+
KeyType::CG => Some(RustExpr::new("CGKeyCode( {} )")),
367+
KeyType::WinScan => Some(RustExpr::new("Make1Code( {} )")),
358368
_ => None,
359369
}
360370
}
@@ -396,8 +406,14 @@ impl KeyType {
396406
}
397407

398408
#[derive(Debug, Clone)]
399-
pub struct RustExpr(pub &'static str);
409+
pub struct RustExpr(pub String);
400410
impl RustExpr {
411+
pub fn new<S: ToString>(s: S) -> Self {
412+
Self(s.to_string())
413+
}
414+
pub fn default() -> Self {
415+
Self::new("{}")
416+
}
401417
pub fn apply(&self, s: &str) -> String {
402418
// let (prefix, suffix) = split_expr(self.0);
403419
// format!("{}{}{}", prefix, s, suffix)
@@ -420,8 +436,8 @@ impl KeyCodeInfo {
420436
Self {
421437
ty,
422438
can_const_check: true,
423-
wrap_expr: if wrap.is_empty() { None } else { Some(RustExpr(wrap)) },
424-
unwrap_expr: RustExpr(unwrap),
439+
wrap_expr: if wrap.is_empty() { None } else { Some(RustExpr::new(wrap)) },
440+
unwrap_expr: RustExpr::new(unwrap),
425441
}
426442
}
427443
pub fn set_can_const_check(mut self, can_const_check: bool) -> Self {
@@ -435,7 +451,7 @@ impl TryFrom<KeyType> for KeyCodeInfo {
435451

436452
fn try_from(ty: KeyType) -> Result<Self, Self::Error> {
437453
match ty {
438-
KeyType::HUT => Ok(KeyCodeInfo::new("u32", "", "AsUsage::usage_value({})").set_can_const_check(false)),
454+
KeyType::HUT => Ok(KeyCodeInfo::new("u32", "", "{}.usage_value()").set_can_const_check(false)),
439455
KeyType::Winput => Ok(KeyCodeInfo::new("u8", "unsafe { std::mem::transmute({}) }", "*{} as u8")),
440456
KeyType::WinVk => Ok(KeyCodeInfo::new("u16", "VIRTUAL_KEY({})", "{}.0")),
441457
KeyType::WinScan => Ok(KeyCodeInfo::new("u32", "Make1Code({})", "{}.0")),
@@ -481,7 +497,7 @@ impl Gen {
481497
let from = self.0;
482498
let to = self.1;
483499
let map = self.build_kv(csv);
484-
ConvertImplTemplate::create(from.name(), to.name(), to.as_value_expr())
500+
ConvertImplTemplate::create(from.name(), to.name(), from.as_key_expr(), to.as_value_expr())
485501
.build(map)
486502
}
487503

@@ -635,10 +651,18 @@ pub fn main() {
635651

636652
let mut index_mod = String::new();
637653
for (from, to) in [
654+
(KeyType::HUT, KeyType::Winput),
655+
638656
(KeyType::Winput, KeyType::HUT),
639657
(KeyType::Winput, KeyType::EnigoMirror),
640658
(KeyType::Winput, KeyType::EnigoDep),
641659

660+
(KeyType::Winput, KeyType::CG),
661+
(KeyType::Winput, KeyType::Keysym),
662+
663+
(KeyType::Winput, KeyType::WinScan),
664+
(KeyType::WinVk, KeyType::WinScan),
665+
642666
(KeyType::EnigoMirror, KeyType::Winput),
643667
(KeyType::EnigoDep, KeyType::Winput),
644668
(KeyType::EnigoMirror, KeyType::WinVk),
@@ -647,12 +671,6 @@ pub fn main() {
647671
(KeyType::EnigoDep, KeyType::Keysym),
648672
(KeyType::EnigoMirror, KeyType::CG),
649673
(KeyType::EnigoDep, KeyType::CG),
650-
651-
(KeyType::Winput, KeyType::CG),
652-
(KeyType::Winput, KeyType::Keysym),
653-
654-
(KeyType::Winput, KeyType::WinScan),
655-
// (KeyType::WinVk, KeyType::WinScan),
656674
] {
657675
let filename = format!("generated.{from:?}_to_{to:?}.rs");
658676
let content = Gen(from, to).build_convert_impl(&csv);
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
// This file is auto-generated. Do not edit manually.
2+
3+
4+
pub fn usage_to_vk(value: Usage) -> Option<Vk> {
5+
let result = match value {
6+
k if k == Button::Button(1) .usage() => Vk::MouseLeft ,
7+
k if k == Button::Button(2) .usage() => Vk::MouseRight ,
8+
k if k == Button::Button(3) .usage() => Vk::MouseMiddle ,
9+
k if k == Button::Button(4) .usage() => Vk::MouseX1 ,
10+
k if k == Button::Button(5) .usage() => Vk::MouseX2 ,
11+
k if k == Consumer::ACBack .usage() => Vk::BrowserBack ,
12+
k if k == Consumer::ACBookmarks .usage() => Vk::BrowserFavorites,
13+
k if k == Consumer::ACForward .usage() => Vk::BrowserForward ,
14+
k if k == Consumer::ACHome .usage() => Vk::BrowserHome ,
15+
k if k == Consumer::ACRefresh .usage() => Vk::BrowserRefresh ,
16+
k if k == Consumer::ACSearch .usage() => Vk::BrowserSearch ,
17+
k if k == Consumer::ACStop .usage() => Vk::BrowserStop ,
18+
k if k == Consumer::ALEmailReader .usage() => Vk::StartMail ,
19+
k if k == Consumer::MediaSelection .usage() => Vk::SelectMedia ,
20+
k if k == Consumer::Mute .usage() => Vk::VolumeMute ,
21+
k if k == Consumer::PlayPause .usage() => Vk::MediaPlayPause ,
22+
k if k == Consumer::ScanNextTrack .usage() => Vk::NextTrack ,
23+
k if k == Consumer::ScanPreviousTrack .usage() => Vk::PrevTrack ,
24+
k if k == Consumer::Stop .usage() => Vk::MediaStop ,
25+
k if k == Consumer::VolumeDecrement .usage() => Vk::VolumeDown ,
26+
k if k == Consumer::VolumeIncrement .usage() => Vk::VolumeUp ,
27+
k if k == GenericDesktop::SystemSleep .usage() => Vk::Sleep ,
28+
k if k == KeyboardKeypad::Keyboard0andRightBracket .usage() => Vk::_0 ,
29+
k if k == KeyboardKeypad::Keyboard1andBang .usage() => Vk::_1 ,
30+
k if k == KeyboardKeypad::Keyboard2andAt .usage() => Vk::_2 ,
31+
k if k == KeyboardKeypad::Keyboard3andHash .usage() => Vk::_3 ,
32+
k if k == KeyboardKeypad::Keyboard4andDollar .usage() => Vk::_4 ,
33+
k if k == KeyboardKeypad::Keyboard5andPercent .usage() => Vk::_5 ,
34+
k if k == KeyboardKeypad::Keyboard6andCaret .usage() => Vk::_6 ,
35+
k if k == KeyboardKeypad::Keyboard7andAmpersand .usage() => Vk::_7 ,
36+
k if k == KeyboardKeypad::Keyboard8andStar .usage() => Vk::_8 ,
37+
k if k == KeyboardKeypad::Keyboard9andLeftBracket .usage() => Vk::_9 ,
38+
k if k == KeyboardKeypad::KeyboardA .usage() => Vk::A ,
39+
k if k == KeyboardKeypad::KeyboardApplication .usage() => Vk::Apps ,
40+
k if k == KeyboardKeypad::KeyboardB .usage() => Vk::B ,
41+
k if k == KeyboardKeypad::KeyboardBackslashandPipe .usage() => Vk::Oem5 ,
42+
k if k == KeyboardKeypad::KeyboardC .usage() => Vk::C ,
43+
k if k == KeyboardKeypad::KeyboardCancel .usage() => Vk::Cancel ,
44+
k if k == KeyboardKeypad::KeyboardCapsLock .usage() => Vk::CapsLock ,
45+
k if k == KeyboardKeypad::KeyboardClear .usage() => Vk::Clear ,
46+
k if k == KeyboardKeypad::KeyboardCommaandLessThan .usage() => Vk::Comma ,
47+
k if k == KeyboardKeypad::KeyboardD .usage() => Vk::D ,
48+
k if k == KeyboardKeypad::KeyboardDashandUnderscore .usage() => Vk::Minus ,
49+
k if k == KeyboardKeypad::KeyboardDelete .usage() => Vk::Backspace ,
50+
k if k == KeyboardKeypad::KeyboardDeleteForward .usage() => Vk::Delete ,
51+
k if k == KeyboardKeypad::KeyboardDownArrow .usage() => Vk::DownArrow ,
52+
k if k == KeyboardKeypad::KeyboardE .usage() => Vk::E ,
53+
k if k == KeyboardKeypad::KeyboardEnd .usage() => Vk::End ,
54+
k if k == KeyboardKeypad::KeyboardEqualsandPlus .usage() => Vk::Plus ,
55+
k if k == KeyboardKeypad::KeyboardEscape .usage() => Vk::Escape ,
56+
k if k == KeyboardKeypad::KeyboardExecute .usage() => Vk::Execute ,
57+
k if k == KeyboardKeypad::KeyboardF .usage() => Vk::F ,
58+
k if k == KeyboardKeypad::KeyboardF1 .usage() => Vk::F1 ,
59+
k if k == KeyboardKeypad::KeyboardF10 .usage() => Vk::F10 ,
60+
k if k == KeyboardKeypad::KeyboardF11 .usage() => Vk::F11 ,
61+
k if k == KeyboardKeypad::KeyboardF12 .usage() => Vk::F12 ,
62+
k if k == KeyboardKeypad::KeyboardF13 .usage() => Vk::F13 ,
63+
k if k == KeyboardKeypad::KeyboardF14 .usage() => Vk::F14 ,
64+
k if k == KeyboardKeypad::KeyboardF15 .usage() => Vk::F15 ,
65+
k if k == KeyboardKeypad::KeyboardF16 .usage() => Vk::F16 ,
66+
k if k == KeyboardKeypad::KeyboardF17 .usage() => Vk::F17 ,
67+
k if k == KeyboardKeypad::KeyboardF18 .usage() => Vk::F18 ,
68+
k if k == KeyboardKeypad::KeyboardF19 .usage() => Vk::F19 ,
69+
k if k == KeyboardKeypad::KeyboardF2 .usage() => Vk::F2 ,
70+
k if k == KeyboardKeypad::KeyboardF20 .usage() => Vk::F20 ,
71+
k if k == KeyboardKeypad::KeyboardF21 .usage() => Vk::F21 ,
72+
k if k == KeyboardKeypad::KeyboardF22 .usage() => Vk::F22 ,
73+
k if k == KeyboardKeypad::KeyboardF23 .usage() => Vk::F23 ,
74+
k if k == KeyboardKeypad::KeyboardF24 .usage() => Vk::F24 ,
75+
k if k == KeyboardKeypad::KeyboardF3 .usage() => Vk::F3 ,
76+
k if k == KeyboardKeypad::KeyboardF4 .usage() => Vk::F4 ,
77+
k if k == KeyboardKeypad::KeyboardF5 .usage() => Vk::F5 ,
78+
k if k == KeyboardKeypad::KeyboardF6 .usage() => Vk::F6 ,
79+
k if k == KeyboardKeypad::KeyboardF7 .usage() => Vk::F7 ,
80+
k if k == KeyboardKeypad::KeyboardF8 .usage() => Vk::F8 ,
81+
k if k == KeyboardKeypad::KeyboardF9 .usage() => Vk::F9 ,
82+
k if k == KeyboardKeypad::KeyboardForwardSlashandQuestionMark.usage() => Vk::Oem2 ,
83+
k if k == KeyboardKeypad::KeyboardG .usage() => Vk::G ,
84+
k if k == KeyboardKeypad::KeyboardGraveAccentandTilde .usage() => Vk::Oem3 ,
85+
k if k == KeyboardKeypad::KeyboardH .usage() => Vk::H ,
86+
k if k == KeyboardKeypad::KeyboardHelp .usage() => Vk::Help ,
87+
k if k == KeyboardKeypad::KeyboardHome .usage() => Vk::Home ,
88+
k if k == KeyboardKeypad::KeyboardI .usage() => Vk::I ,
89+
k if k == KeyboardKeypad::KeyboardInsert .usage() => Vk::Insert ,
90+
k if k == KeyboardKeypad::KeyboardJ .usage() => Vk::J ,
91+
k if k == KeyboardKeypad::KeyboardK .usage() => Vk::K ,
92+
k if k == KeyboardKeypad::KeyboardL .usage() => Vk::L ,
93+
k if k == KeyboardKeypad::KeyboardLeftAlt .usage() => Vk::LeftMenu ,
94+
k if k == KeyboardKeypad::KeyboardLeftAposandDouble .usage() => Vk::Oem7 ,
95+
k if k == KeyboardKeypad::KeyboardLeftArrow .usage() => Vk::LeftArrow ,
96+
k if k == KeyboardKeypad::KeyboardLeftBrace .usage() => Vk::Oem4 ,
97+
k if k == KeyboardKeypad::KeyboardLeftControl .usage() => Vk::LeftControl ,
98+
k if k == KeyboardKeypad::KeyboardLeftGUI .usage() => Vk::LeftWin ,
99+
k if k == KeyboardKeypad::KeyboardLeftShift .usage() => Vk::LeftShift ,
100+
k if k == KeyboardKeypad::KeyboardM .usage() => Vk::M ,
101+
k if k == KeyboardKeypad::KeyboardN .usage() => Vk::N ,
102+
k if k == KeyboardKeypad::KeyboardNonUSBackslashandPipe .usage() => Vk::Oem102 ,
103+
k if k == KeyboardKeypad::KeyboardO .usage() => Vk::O ,
104+
k if k == KeyboardKeypad::KeyboardP .usage() => Vk::P ,
105+
k if k == KeyboardKeypad::KeyboardPageDown .usage() => Vk::PageDown ,
106+
k if k == KeyboardKeypad::KeyboardPageUp .usage() => Vk::PageUp ,
107+
k if k == KeyboardKeypad::KeyboardPause .usage() => Vk::Pause ,
108+
k if k == KeyboardKeypad::KeyboardPeriodandGreaterThan .usage() => Vk::Period ,
109+
k if k == KeyboardKeypad::KeyboardPrintScreen .usage() => Vk::PrintScreen ,
110+
k if k == KeyboardKeypad::KeyboardQ .usage() => Vk::Q ,
111+
k if k == KeyboardKeypad::KeyboardR .usage() => Vk::R ,
112+
k if k == KeyboardKeypad::KeyboardReturnEnter .usage() => Vk::Enter ,
113+
k if k == KeyboardKeypad::KeyboardRightAlt .usage() => Vk::RightMenu ,
114+
k if k == KeyboardKeypad::KeyboardRightArrow .usage() => Vk::RightArrow ,
115+
k if k == KeyboardKeypad::KeyboardRightBrace .usage() => Vk::Oem6 ,
116+
k if k == KeyboardKeypad::KeyboardRightControl .usage() => Vk::RightControl ,
117+
k if k == KeyboardKeypad::KeyboardRightGUI .usage() => Vk::RightWin ,
118+
k if k == KeyboardKeypad::KeyboardRightShift .usage() => Vk::RightShift ,
119+
k if k == KeyboardKeypad::KeyboardS .usage() => Vk::S ,
120+
k if k == KeyboardKeypad::KeyboardScrollLock .usage() => Vk::Scroll ,
121+
k if k == KeyboardKeypad::KeyboardSelect .usage() => Vk::Select ,
122+
k if k == KeyboardKeypad::KeyboardSemiColonandColon .usage() => Vk::Oem1 ,
123+
k if k == KeyboardKeypad::KeyboardSpacebar .usage() => Vk::Space ,
124+
k if k == KeyboardKeypad::KeyboardT .usage() => Vk::T ,
125+
k if k == KeyboardKeypad::KeyboardTab .usage() => Vk::Tab ,
126+
k if k == KeyboardKeypad::KeyboardU .usage() => Vk::U ,
127+
k if k == KeyboardKeypad::KeyboardUpArrow .usage() => Vk::UpArrow ,
128+
k if k == KeyboardKeypad::KeyboardV .usage() => Vk::V ,
129+
k if k == KeyboardKeypad::KeyboardW .usage() => Vk::W ,
130+
k if k == KeyboardKeypad::KeyboardX .usage() => Vk::X ,
131+
k if k == KeyboardKeypad::KeyboardY .usage() => Vk::Y ,
132+
k if k == KeyboardKeypad::KeyboardZ .usage() => Vk::Z ,
133+
k if k == KeyboardKeypad::Keypad0andInsert .usage() => Vk::Numpad0 ,
134+
k if k == KeyboardKeypad::Keypad1andEnd .usage() => Vk::Numpad1 ,
135+
k if k == KeyboardKeypad::Keypad2andDownArrow .usage() => Vk::Numpad2 ,
136+
k if k == KeyboardKeypad::Keypad3andPageDn .usage() => Vk::Numpad3 ,
137+
k if k == KeyboardKeypad::Keypad4andLeftArrow .usage() => Vk::Numpad4 ,
138+
k if k == KeyboardKeypad::Keypad5 .usage() => Vk::Numpad5 ,
139+
k if k == KeyboardKeypad::Keypad6andRightArrow .usage() => Vk::Numpad6 ,
140+
k if k == KeyboardKeypad::Keypad7andHome .usage() => Vk::Numpad7 ,
141+
k if k == KeyboardKeypad::Keypad8andUpArrow .usage() => Vk::Numpad8 ,
142+
k if k == KeyboardKeypad::Keypad9andPageUp .usage() => Vk::Numpad9 ,
143+
k if k == KeyboardKeypad::KeypadDash .usage() => Vk::Subtract ,
144+
k if k == KeyboardKeypad::KeypadForwardSlash .usage() => Vk::Divide ,
145+
k if k == KeyboardKeypad::KeypadNumLockandClear .usage() => Vk::Numlock ,
146+
k if k == KeyboardKeypad::KeypadPeriodandDelete .usage() => Vk::Decimal ,
147+
k if k == KeyboardKeypad::KeypadPlus .usage() => Vk::Add ,
148+
k if k == KeyboardKeypad::KeypadStar .usage() => Vk::Multiply ,
149+
_ => return None,
150+
};
151+
Some(result)
152+
}
153+
154+
impl crate::convert::Convert<Usage, Vk> for crate::convert::Converter {
155+
fn convert(value: Usage) -> Option<Vk> {
156+
usage_to_vk(value)
157+
}
158+
}

0 commit comments

Comments
 (0)