use std::{ fs::File, io::{self, Write}, path::Path, }; use digest::{self, Digest}; use olpc_cjson::CanonicalFormatter; use serde::Serialize; use serde_json::error::Result; pub fn new_serializer(writer: W) -> serde_json::Serializer { serde_json::Serializer::with_formatter(writer, CanonicalFormatter::new()) } pub fn to_writer(writer: W, value: &T) -> Result<()> { let mut ser = new_serializer(writer); value.serialize(&mut ser) } pub fn to_file, T: ?Sized + Serialize>(path: P, value: &T) -> io::Result<()> { let file = File::create(path)?; to_writer(&file, value)?; file.sync_all() } pub fn to_string(value: &T) -> Result { let mut ret = Vec::new(); to_writer(&mut ret, value)?; Ok(String::from_utf8(ret).unwrap()) } pub fn digest(value: &T) -> Result> { let mut digest = ::new(); to_writer(&mut digest, value)?; Ok(digest.finalize()) }