use serde_derive::{Deserialize, Serialize};
use std::collections::HashMap;
use std::error::Error;
use std::io;
use winreg::transaction::Transaction;
use winreg::HKCU;
#[derive(Debug, Serialize, Deserialize, PartialEq)]
struct Coords {
x: u32,
y: u32,
}
#[derive(Debug, Serialize, Deserialize, PartialEq)]
struct Size {
w: u32,
h: u32,
}
#[derive(Debug, Serialize, Deserialize, PartialEq)]
struct Rectangle {
coords: Option<Coords>,
size: Size,
}
#[derive(Debug, Serialize, Deserialize, PartialEq)]
struct Test {
t_bool: bool,
t_u8: u8,
t_u16: u16,
t_u32: u32,
t_u64: u64,
t_usize: usize,
t_struct: Rectangle,
t_map: HashMap<String, u32>,
t_string: String,
#[serde(with = "serde_bytes")]
t_bytes: Vec<u8>,
#[serde(rename = "")] t_char: char,
t_i8: i8,
t_i16: i16,
t_i32: i32,
t_i64: i64,
t_isize: isize,
t_f64: f64,
t_f32: f32,
}
fn main() -> Result<(), Box<dyn Error>> {
let transaction = Transaction::new()?;
let (key, _disp) = HKCU.create_subkey_transacted("Software\\RustEncode", &transaction)?;
let mut map = HashMap::new();
map.insert("".to_owned(), 0); map.insert("v1".to_owned(), 1);
map.insert("v2".to_owned(), 2);
map.insert("v3".to_owned(), 3);
let v1 = Test {
t_bool: false,
t_u8: 127,
t_u16: 32768,
t_u32: 123_456_789,
t_u64: 123_456_789_101_112,
t_usize: 1_234_567_891,
t_struct: Rectangle {
coords: Some(Coords { x: 55, y: 77 }),
size: Size { w: 500, h: 300 },
},
t_map: map,
t_string: "test 123!".to_owned(),
t_bytes: vec![0xDE, 0xAD, 0xBE, 0xEF],
t_char: 'a',
t_i8: -123,
t_i16: -2049,
t_i32: 20100,
t_i64: -12_345_678_910,
t_isize: -1_234_567_890,
t_f64: -0.01,
t_f32: 3.15,
};
key.encode_transacted(&v1, &transaction)?;
println!("Commit transaction? [y/N]:");
let mut input = String::new();
io::stdin().read_line(&mut input)?;
input = input.trim_end().to_owned();
if input == "y" || input == "Y" {
transaction.commit()?;
println!("Transaction committed.");
} else {
transaction.rollback()?;
println!("Transaction wasn't committed, it will be rolled back.");
}
let key = HKCU.open_subkey("Software\\RustEncode")?;
let v2: Test = key.decode()?;
println!("Decoded {:?}", v2);
println!("Equal to encoded: {:?}", v1 == v2);
Ok(())
}