use chrono::prelude::*;
use serde::Deserialize;
use std::error::Error;
use std::ffi::OsStr;
use std::fs::{read_dir, File};
use std::io::{BufRead, BufReader};
use std::path::Path;
#[derive(Deserialize, Debug, PartialEq)]
pub struct Entry<E> {
pub timestamp: DateTime<Utc>,
#[serde(flatten)]
pub event: E,
#[serde(default)]
pub horizons: bool,
#[serde(default)]
pub odyssey: bool,
}
#[test]
fn entry() {
use crate::Government;
#[derive(Deserialize)]
enum Dumb {
Foo,
}
assert!(serde_json::from_str::<Entry<Dumb>>(
r#"
{
"timestamp": "1970-01-01T00:00:00Z",
"Foo": null
}
"#
)
.is_ok());
#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
#[allow(unused)]
struct Dumber {
key: (),
}
assert!(serde_json::from_str::<Entry<Dumber>>(
r#"
{
"timestamp": "1970-01-01T00:00:00Z",
"Key": null
}
"#
)
.is_ok());
#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
#[allow(unused)]
struct Dumbest {
key: Government,
}
assert!(serde_json::from_str::<Entry<Dumbest>>(
r#"
{
"timestamp": "1970-01-01T00:00:00Z",
"Key": "Anarchy"
}
"#
)
.is_ok());
}
pub fn parse_journal_file<P: AsRef<Path>>(
path: P,
) -> Result<Vec<Entry<Event>>, Box<dyn Error>> {
let file = File::open(path)?;
let reader = BufReader::new(file);
Ok(reader
.lines()
.filter_map(|line| line.map(|l| serde_json::from_str(&l)).ok())
.flatten()
.collect())
}
pub fn parse_journal_dir<P: AsRef<Path>>(
path: P,
) -> Result<Vec<Entry<Event>>, Box<dyn Error>> {
let mut entries = Vec::new();
for entry in read_dir(path)? {
let entry = entry?;
if entry.file_type().unwrap().is_file()
&& entry.path().extension().and_then(OsStr::to_str) == Some("log")
{
entries.append(&mut parse_journal_file(entry.path())?);
}
}
Ok(entries)
}
pub fn parse_status_file<P: AsRef<Path>, E>(
path: P,
) -> Result<Entry<E>, serde_json::Error>
where
for<'de> E: Deserialize<'de>,
{
let file = File::open(path).unwrap();
let reader = BufReader::new(file);
serde_json::from_reader(reader)
}
pub mod incremental;
pub use self::incremental::Event;
pub mod status {}
pub mod route;
pub use self::route::NavRoute;
pub mod cargo {}
pub mod market;
pub use self::market::Market;
pub mod shipyard {}
pub mod outfitting {}
pub mod modules_info {}