use serde_json::{json, Value};
use super::request::Request;
use super::{BackendError, Outcome};
use crate::{validate_personal_dictionary_entry, PersonalDictionaryEntry, PersonalDictionaryKind};
fn kind(name: &str) -> Result<PersonalDictionaryKind, BackendError> {
match name {
"pinyin" => Ok(PersonalDictionaryKind::Pinyin),
"wubi" => Ok(PersonalDictionaryKind::Wubi),
"wubi98" => Ok(PersonalDictionaryKind::Wubi98),
"quick" => Ok(PersonalDictionaryKind::QuickPhrase),
"english" => Ok(PersonalDictionaryKind::English),
_ => Err(BackendError::InvalidRequest),
}
}
pub(super) fn validate_dictionary(request: &Request) -> Outcome {
let name = request.string("kind")?;
let weight = match request.field("weight") {
None => PersonalDictionaryEntry::DEFAULT_WEIGHT,
Some(value) => value.as_i64().ok_or(BackendError::InvalidRequest)?,
};
let entry = PersonalDictionaryEntry {
kind: kind(name)?,
key: request.string("code")?.to_owned(),
value: request.text().to_owned(),
weight,
};
let validated = validate_personal_dictionary_entry(&entry)
.map_err(|_| BackendError::InvalidDictionaryEntry)?;
Ok(json!({
"kind": name,
"code": validated.key,
"word": validated.value,
"weight": validated.weight,
}))
}
pub(super) fn validate_dictionary_batch(request: &Request) -> Outcome {
let entries = request.batch("entries")?;
let mut validated = Vec::new();
for entry in entries {
let mut single = entry.clone();
single
.as_object_mut()
.ok_or(BackendError::InvalidRequest)?
.insert("operation".into(), Value::from("validate_dictionary"));
let validated_entry = validate_dictionary(&Request::new(&single)?)?;
if validated.capacity() == 0 {
validated.reserve_exact(entries.len());
}
validated.push(validated_entry);
}
Ok(json!({ "entries": validated }))
}