use crate::app::i18n::fill;
use crate::share::{self, Kind};
use bevy::prelude::*;
pub fn copy(clipboard: &mut Clipboard, kind: Kind, payload: &[u8]) -> Result<String, String> {
let code = share::encode(kind, payload);
clipboard
.set_text(code.clone())
.map(|()| code)
.map_err(|e| e.to_string())
}
pub fn copy_feedback(
clipboard: &mut Clipboard,
tr: &crate::app::i18n::Tr,
kind: Kind,
payload: &[u8],
ok: &str,
) -> String {
match copy(clipboard, kind, payload) {
Ok(code) => fill(ok, &[("n", &code.len().to_string())]),
Err(e) => fill(tr.code_copy_failed, &[("e", &e)]),
}
}
pub fn paste(clipboard: &mut Clipboard) -> Option<(Kind, Vec<u8>)> {
let text = clipboard.fetch_text().poll_result()?.ok()?;
share::decode(&text)
}
pub fn wrong_kind(tr: &crate::app::i18n::Tr, wanted: Kind, got: Kind) -> String {
let name = |kind: Kind| match kind {
Kind::Beach => tr.code_kind_beach,
Kind::Level => tr.code_kind_level,
Kind::Round => tr.code_kind_round,
};
fill(
tr.code_wrong_kind,
&[("want", name(wanted)), ("got", name(got))],
)
}
pub fn payload_text(
pasted: Option<(Kind, Vec<u8>)>,
tr: &crate::app::i18n::Tr,
want: Kind,
bad: &str,
) -> Result<String, String> {
let (kind, payload) = pasted.ok_or_else(|| tr.code_none_pasted.to_string())?;
if kind != want {
return Err(wrong_kind(tr, want, kind));
}
String::from_utf8(payload).map_err(|e| fill(bad, &[("e", &e.to_string())]))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn the_wrong_sort_of_code_says_which_sort_it_is() {
let complaint = wrong_kind(&crate::app::i18n::EN, Kind::Round, Kind::Level);
assert!(complaint.contains("a level"), "{complaint}");
assert!(complaint.contains("a round"), "{complaint}");
assert!(!complaint.contains('{'), "every slot filled: {complaint}");
}
}