use serde_json::{Value, json};
use zenith_session::adapter::OsFs;
use zenith_session::put_object;
use super::resources::{self, ResourceMeta};
pub const INLINE_LIMIT: usize = 8 * 1024;
pub fn compact(value: &Value) -> String {
crate::commands::serialize_compact(value)
}
pub fn store_link(doc_id: &str, bytes: &[u8], ext: &str, name: &str) -> Result<Value, String> {
let paths = resources::open_store()?;
let fs = OsFs;
let sha = put_object(&fs, &paths, doc_id, bytes).map_err(|e| e.message)?;
let uri = resources::blob_uri(doc_id, &sha, ext);
let (mime, _) = resources::mime_for_ext(ext);
let size = bytes.len() as u64;
resources::register(
&uri,
ResourceMeta {
mime: mime.to_owned(),
name: name.to_owned(),
size,
},
);
Ok(json!({ "uri": uri, "mimeType": mime, "name": name, "size": size }))
}
pub fn maybe_offload(doc_id: Option<&str>, value: Value, ext: &str, name: &str) -> Value {
let text = compact(&value);
match doc_id {
Some(id) if text.len() >= INLINE_LIMIT => {
match store_link(id, text.as_bytes(), ext, name) {
Ok(link) => json!({ "resource": link, "offloaded": true }),
Err(_) => value,
}
}
_ => value,
}
}