wasm_example_translator/
lib.rs1use extism_pdk::{plugin_fn, FnResult};
2pub use surfer_translation_types::plugin_types::TranslateParams;
3use surfer_translation_types::{
4 SubFieldTranslationResult, TranslationPreference, TranslationResult, ValueKind, VariableInfo,
5 VariableMeta, VariableValue,
6};
7
8#[plugin_fn]
9pub fn new() -> FnResult<()> {
10 Ok(())
11}
12
13#[plugin_fn]
14pub fn name() -> FnResult<String> {
15 Ok("Wasm Example Translator".to_string())
16}
17
18#[plugin_fn]
19pub fn translate(
20 TranslateParams { variable, value }: TranslateParams,
21) -> FnResult<TranslationResult> {
22 let binary_digits = match value {
23 VariableValue::BigUint(big_uint) => {
24 let raw = format!("{big_uint:b}");
25 let padding = (0..((variable.num_bits.unwrap_or_default() as usize)
26 .saturating_sub(raw.len())))
27 .map(|_| "0")
28 .collect::<Vec<_>>()
29 .join("");
30
31 format!("{padding}{raw}")
32 }
33 VariableValue::String(v) => v.clone(),
34 };
35
36 let digits = binary_digits.chars().collect::<Vec<_>>();
37
38 Ok(TranslationResult {
39 val: surfer_translation_types::ValueRepr::Tuple,
40 subfields: {
41 digits
42 .chunks(4)
43 .enumerate()
44 .map(|(i, chunk)| SubFieldTranslationResult {
45 name: format!("[{i}]"),
46 result: TranslationResult {
47 val: surfer_translation_types::ValueRepr::Bits(4, chunk.iter().collect()),
48 subfields: vec![],
49 kind: ValueKind::Normal,
50 },
51 })
52 .collect()
53 },
54 kind: ValueKind::Normal,
55 })
56}
57
58#[plugin_fn]
59pub fn variable_info(variable: VariableMeta<(), ()>) -> FnResult<VariableInfo> {
60 Ok(VariableInfo::Compound {
61 subfields: (0..(variable.num_bits.unwrap_or_default() / 4 + 1))
62 .map(|i| (format!("[{i}]"), VariableInfo::Bits))
63 .collect(),
64 })
65}
66
67#[plugin_fn]
68pub fn translates(_variable: VariableMeta<(), ()>) -> FnResult<TranslationPreference> {
69 Ok(TranslationPreference::Yes)
70}