use std::io::{Read, Write};
use serde::{Deserialize, Serialize};
use crate::output::shard::error::ShardError;
use crate::output::shard::file::SHARD_SCHEMA_VERSION;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ShardHeader {
pub schema_version: u32,
pub tool_version: String,
pub created_at: String,
}
impl ShardHeader {
pub fn new(created_at: impl Into<String>) -> Self {
Self {
schema_version: SHARD_SCHEMA_VERSION,
tool_version: env!("CARGO_PKG_VERSION").to_string(),
created_at: created_at.into(),
}
}
pub fn with_tool_version(
tool_version: impl Into<String>,
created_at: impl Into<String>,
) -> Self {
Self {
schema_version: SHARD_SCHEMA_VERSION,
tool_version: tool_version.into(),
created_at: created_at.into(),
}
}
}
pub fn write_header<W: Write>(mut writer: W, header: &ShardHeader) -> Result<(), ShardError> {
if header.schema_version != SHARD_SCHEMA_VERSION {
return Err(ShardError::SchemaVersion {
line: 1,
found: header.schema_version,
expected: SHARD_SCHEMA_VERSION,
});
}
serde_json::to_writer_pretty(&mut writer, header).map_err(ShardError::Encode)?;
writer.write_all(b"\n")?;
writer.flush()?;
Ok(())
}
pub fn read_header<R: Read>(reader: R) -> Result<ShardHeader, ShardError> {
let header: ShardHeader =
serde_json::from_reader(reader).map_err(|source| ShardError::Decode { line: 1, source })?;
if header.schema_version != SHARD_SCHEMA_VERSION {
return Err(ShardError::SchemaVersion {
line: 1,
found: header.schema_version,
expected: SHARD_SCHEMA_VERSION,
});
}
Ok(header)
}