wasm_example_translator/
lib.rs

1use 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}