andotp_to_otpauth/src/main.rs

48 lines
1.1 KiB
Rust

extern crate serde;
#[macro_use]
extern crate serde_derive;
extern crate serde_json;
extern crate urlencoding;
#[derive(Serialize, Deserialize)]
pub struct OTP {
secret: String,
label: String,
digits: i64,
#[serde(rename = "type")]
otp_type: String,
algorithm: String,
thumbnail: String,
last_used: i64,
period: i64,
tags: Vec<String>,
}
fn main() {
let otp_array_json = match std::env::args().nth(1) {
Some(otp_array) => otp_array,
None => {
eprintln!("Could not get json containing OTPs.");
return;
}
};
let otp_array: Vec<OTP> = match serde_json::from_str(&otp_array_json) {
Ok(otp_array) => otp_array,
Err(err) => {
eprintln!("Could not deserialize OTPs: {}", err);
return;
}
};
for otp in otp_array {
println!(
"otpauth://{}/{}?secret={}&algorithm={}&digits={}&period={}",
otp.otp_type.to_ascii_lowercase(),
urlencoding::encode(&otp.label),
otp.secret,
otp.algorithm,
otp.digits,
otp.period
);
}
}