parent
1ec37e2370
commit
46871da4c1
@ -0,0 +1,231 @@ |
||||
use std::{ |
||||
fs::{File, OpenOptions}, |
||||
io::{BufWriter, Read, Write}, |
||||
path::Path, |
||||
}; |
||||
|
||||
use serde_json; |
||||
|
||||
use data::Data; |
||||
use Result; |
||||
|
||||
/// Attempts to deserialize a Data struct from a string
|
||||
pub fn from_str(s: &str) -> Result<Data> { |
||||
Ok(serde_json::from_str(s)?) |
||||
} |
||||
|
||||
/// Attempts to deserialize a Data struct from a slice of bytes
|
||||
pub fn from_slice(s: &[u8]) -> Result<Data> { |
||||
Ok(serde_json::from_slice(s)?) |
||||
} |
||||
|
||||
/// Attempts to deserialize a Data struct from something that implements
|
||||
/// the std::io::Read trait
|
||||
pub fn from_reader<R: Read>(mut r: R) -> Result<Data> { |
||||
let mut buffer = Vec::new(); |
||||
r.read_to_end(&mut buffer)?; |
||||
from_slice(&buffer) |
||||
} |
||||
|
||||
/// Attempts to deserialize a Data struct from a file
|
||||
pub fn from_file<P: AsRef<Path>>(path: P) -> Result<Data> { |
||||
let path = path.as_ref(); |
||||
let file = File::open(path)?; |
||||
Ok(from_reader(file)?) |
||||
} |
||||
|
||||
/// Attempts to serialize a Data struct to a String
|
||||
pub fn to_string(data: &Data) -> Result<String> { |
||||
Ok(serde_json::to_string_pretty(data)?) |
||||
} |
||||
|
||||
/// Attempts to serialize a Data struct to a Vec of bytes
|
||||
pub fn to_vec(data: &Data) -> Result<Vec<u8>> { |
||||
Ok(serde_json::to_vec(data)?) |
||||
} |
||||
|
||||
/// Attempts to serialize a Data struct to something that implements the
|
||||
/// std::io::Write trait
|
||||
pub fn to_writer<W: Write>(data: &Data, writer: W) -> Result<()> { |
||||
let mut buf_writer = BufWriter::new(writer); |
||||
let vec = to_vec(data)?; |
||||
buf_writer.write(&vec)?; |
||||
Ok(()) |
||||
} |
||||
|
||||
/// Attempts to serialize a Data struct to a file
|
||||
///
|
||||
/// When opening the file, this will set the `.write(true)` and
|
||||
/// `.truncate(true)` options, use the next method for more
|
||||
/// fine-grained control
|
||||
pub fn to_file<P: AsRef<Path>>(data: &Data, path: P) -> Result<()> { |
||||
let mut options = OpenOptions::new(); |
||||
options.create(true).write(true).truncate(true); |
||||
to_file_with_options(data, path, options)?; |
||||
Ok(()) |
||||
} |
||||
|
||||
/// Attempts to serialize a Data struct to a file
|
||||
pub fn to_file_with_options<P: AsRef<Path>>( |
||||
data: &Data, |
||||
path: P, |
||||
options: OpenOptions, |
||||
) -> Result<()> { |
||||
let path = path.as_ref(); |
||||
let file = options.open(path)?; |
||||
to_writer(data, file)?; |
||||
Ok(()) |
||||
} |
||||
|
||||
#[cfg(test)] |
||||
mod tests { |
||||
use super::*; |
||||
use std::{fs::OpenOptions, io::Cursor}; |
||||
use tempfile::{tempdir, NamedTempFile}; |
||||
|
||||
const DOC: &'static str = indoc!( |
||||
r#" |
||||
{ |
||||
"base": "https://example.com", |
||||
"client_id": "adbc01234", |
||||
"client_secret": "0987dcba", |
||||
"redirect": "urn:ietf:wg:oauth:2.0:oob", |
||||
"token": "fedc5678" |
||||
} |
||||
"# |
||||
); |
||||
|
||||
#[test] |
||||
fn test_from_str() { |
||||
let desered = from_str(DOC).expect("Couldn't deserialize Data"); |
||||
assert_eq!( |
||||
desered, |
||||
Data { |
||||
base: "https://example.com".into(), |
||||
client_id: "adbc01234".into(), |
||||
client_secret: "0987dcba".into(), |
||||
redirect: "urn:ietf:wg:oauth:2.0:oob".into(), |
||||
token: "fedc5678".into(), |
||||
} |
||||
); |
||||
} |
||||
#[test] |
||||
fn test_from_slice() { |
||||
let doc = DOC.as_bytes(); |
||||
let desered = from_slice(&doc).expect("Couldn't deserialize Data"); |
||||
assert_eq!( |
||||
desered, |
||||
Data { |
||||
base: "https://example.com".into(), |
||||
client_id: "adbc01234".into(), |
||||
client_secret: "0987dcba".into(), |
||||
redirect: "urn:ietf:wg:oauth:2.0:oob".into(), |
||||
token: "fedc5678".into(), |
||||
} |
||||
); |
||||
} |
||||
#[test] |
||||
fn test_from_reader() { |
||||
let doc = DOC.as_bytes(); |
||||
let doc = Cursor::new(doc); |
||||
let desered = from_reader(doc).expect("Couldn't deserialize Data"); |
||||
assert_eq!( |
||||
desered, |
||||
Data { |
||||
base: "https://example.com".into(), |
||||
client_id: "adbc01234".into(), |
||||
client_secret: "0987dcba".into(), |
||||
redirect: "urn:ietf:wg:oauth:2.0:oob".into(), |
||||
token: "fedc5678".into(), |
||||
} |
||||
); |
||||
} |
||||
#[test] |
||||
fn test_from_file() { |
||||
let mut datafile = NamedTempFile::new().expect("Couldn't create tempfile"); |
||||
write!(&mut datafile, "{}", DOC).expect("Couldn't write Data to file"); |
||||
let desered = from_file(datafile.path()).expect("Couldn't deserialize Data"); |
||||
assert_eq!( |
||||
desered, |
||||
Data { |
||||
base: "https://example.com".into(), |
||||
client_id: "adbc01234".into(), |
||||
client_secret: "0987dcba".into(), |
||||
redirect: "urn:ietf:wg:oauth:2.0:oob".into(), |
||||
token: "fedc5678".into(), |
||||
} |
||||
); |
||||
} |
||||
#[test] |
||||
fn test_to_string() { |
||||
let data = Data { |
||||
base: "https://example.com".into(), |
||||
client_id: "adbc01234".into(), |
||||
client_secret: "0987dcba".into(), |
||||
redirect: "urn:ietf:wg:oauth:2.0:oob".into(), |
||||
token: "fedc5678".into(), |
||||
}; |
||||
let s = to_string(&data).expect("Couldn't serialize Data"); |
||||
let desered = from_str(&s).expect("Couldn't deserialize Data"); |
||||
assert_eq!(data, desered); |
||||
} |
||||
#[test] |
||||
fn test_to_vec() { |
||||
let data = Data { |
||||
base: "https://example.com".into(), |
||||
client_id: "adbc01234".into(), |
||||
client_secret: "0987dcba".into(), |
||||
redirect: "urn:ietf:wg:oauth:2.0:oob".into(), |
||||
token: "fedc5678".into(), |
||||
}; |
||||
let v = to_vec(&data).expect("Couldn't write to vec"); |
||||
let desered = from_slice(&v).expect("Couldn't deserialize data"); |
||||
assert_eq!(data, desered); |
||||
} |
||||
#[test] |
||||
fn test_to_writer() { |
||||
let data = Data { |
||||
base: "https://example.com".into(), |
||||
client_id: "adbc01234".into(), |
||||
client_secret: "0987dcba".into(), |
||||
redirect: "urn:ietf:wg:oauth:2.0:oob".into(), |
||||
token: "fedc5678".into(), |
||||
}; |
||||
let mut buffer = Vec::new(); |
||||
to_writer(&data, &mut buffer).expect("Couldn't write to writer"); |
||||
let reader = Cursor::new(buffer); |
||||
let desered = from_reader(reader).expect("Couldn't deserialize Data"); |
||||
assert_eq!(data, desered); |
||||
} |
||||
#[test] |
||||
fn test_to_file() { |
||||
let data = Data { |
||||
base: "https://example.com".into(), |
||||
client_id: "adbc01234".into(), |
||||
client_secret: "0987dcba".into(), |
||||
redirect: "urn:ietf:wg:oauth:2.0:oob".into(), |
||||
token: "fedc5678".into(), |
||||
}; |
||||
let tempdir = tempdir().expect("Couldn't create tempdir"); |
||||
let filename = tempdir.path().join("mastodon-data.json"); |
||||
to_file(&data, &filename).expect("Couldn't write to file"); |
||||
let desered = from_file(&filename).expect("Couldn't deserialize Data"); |
||||
assert_eq!(data, desered); |
||||
} |
||||
#[test] |
||||
fn test_to_file_with_options() { |
||||
let data = Data { |
||||
base: "https://example.com".into(), |
||||
client_id: "adbc01234".into(), |
||||
client_secret: "0987dcba".into(), |
||||
redirect: "urn:ietf:wg:oauth:2.0:oob".into(), |
||||
token: "fedc5678".into(), |
||||
}; |
||||
let file = NamedTempFile::new().expect("Couldn't create tempfile"); |
||||
let mut options = OpenOptions::new(); |
||||
options.write(true).create(false).truncate(true); |
||||
to_file_with_options(&data, file.path(), options).expect("Couldn't write to file"); |
||||
let desered = from_file(file.path()).expect("Couldn't deserialize Data"); |
||||
assert_eq!(data, desered); |
||||
} |
||||
} |
Loading…
Reference in new issue