44 lines
1.4 KiB
Rust
44 lines
1.4 KiB
Rust
use std::{io::Write, process::Command};
|
|
|
|
use icu_locid::{langid, LanguageIdentifier};
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
use crate::{read_fh, Message};
|
|
|
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
|
struct EditorMessage {
|
|
description: String,
|
|
source: String,
|
|
content: String,
|
|
}
|
|
|
|
pub struct Editor {}
|
|
|
|
impl Editor {
|
|
pub fn edit(msg: &mut Message, locale: LanguageIdentifier, editor: &str) {
|
|
let description = msg.description().to_owned();
|
|
let source_string = msg.variant_mut(langid!("en")).content().to_owned();
|
|
let variant = msg.variant_mut(locale);
|
|
// let editable_content = EditorMessage::from_variant(description, &variant);
|
|
let editable_content = EditorMessage {
|
|
description,
|
|
source: source_string,
|
|
content: variant.content().to_owned(),
|
|
};
|
|
|
|
let mut file = tempfile::NamedTempFile::new().unwrap();
|
|
let _ = file.write(toml::to_string(&editable_content).unwrap().as_bytes());
|
|
let _ = file.flush();
|
|
let mut cmd = Command::new(editor).args([file.path()]).spawn().unwrap();
|
|
cmd.wait().unwrap();
|
|
let file = file.reopen().unwrap();
|
|
let content = read_fh(&file).unwrap();
|
|
|
|
let new_variant: EditorMessage =
|
|
toml::from_str(&String::from_utf8(content).unwrap()).unwrap();
|
|
|
|
variant.set_content(new_variant.content);
|
|
msg.set_description(new_variant.description);
|
|
}
|
|
}
|