mod readonly;
mod core;
mod alias;
mod fhr_metadata;
mod import;
mod persistence;
mod export;
#[cfg(test)]
mod tests;
pub use self::readonly::ReadonlyRefgetStore;
pub use self::core::RefgetStore;
pub use self::alias::{AliasKind, AliasManager};
pub use self::fhr_metadata::{
FhrMetadata, FhrAuthor, FhrIdentifier, FhrTaxon, FhrVitalStats,
load_sidecars, write_sidecars, write_sidecar, remove_sidecar, sidecar_path, load_from_json,
};
use serde::{Deserialize, Serialize};
use std::io::{BufRead, BufReader, Read};
pub(crate) use crate::hashkeyable::DigestKey;
pub(crate) const DEFAULT_SEQDATA_PATH_TEMPLATE: &str = "sequences/%s2/%s.seq";
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PagedResult<T> {
pub results: Vec<T>,
pub pagination: Pagination,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Pagination {
pub page: usize,
pub page_size: usize,
pub total: usize,
}
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq)]
pub enum StorageMode {
Raw,
Encoded,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RetrievedSequence {
pub sequence: String,
pub chrom_name: String,
pub start: u32,
pub end: u32,
}
#[derive(Clone, Copy)]
pub struct FastaImportOptions<'a> {
pub(crate) force: bool,
pub(crate) namespaces: &'a [&'a str],
}
impl<'a> Default for FastaImportOptions<'a> {
fn default() -> Self {
Self {
force: false,
namespaces: &[],
}
}
}
impl<'a> FastaImportOptions<'a> {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn force(mut self, yes: bool) -> Self {
self.force = yes;
self
}
#[must_use]
pub fn namespaces(mut self, ns: &'a [&'a str]) -> Self {
self.namespaces = ns;
self
}
}
#[derive(Serialize, Deserialize, Debug)]
pub(crate) struct StoreMetadata {
pub(crate) version: u32,
pub(crate) seqdata_path_template: String,
pub(crate) collections_path_template: String,
pub(crate) sequence_index: String,
#[serde(default)]
pub(crate) collection_index: Option<String>,
pub(crate) mode: StorageMode,
pub(crate) created_at: String,
#[serde(default = "default_true")]
pub(crate) ancillary_digests: bool,
#[serde(default)]
pub(crate) attribute_index: bool,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub(crate) sequence_alias_namespaces: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub(crate) collection_alias_namespaces: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub(crate) modified: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub(crate) collections_digest: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub(crate) sequences_digest: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub(crate) aliases_digest: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub(crate) fhr_digest: Option<String>,
}
pub(crate) fn default_true() -> bool {
true
}
#[derive(Debug, Clone)]
pub struct StoreStats {
pub n_sequences: usize,
pub n_sequences_loaded: usize,
pub n_collections: usize,
pub n_collections_loaded: usize,
pub storage_mode: String,
}
pub(crate) fn format_bytes(bytes: usize) -> String {
const UNITS: &[&str] = &["B", "KB", "MB", "GB", "TB"];
let mut size = bytes as f64;
let mut unit_idx = 0;
while size >= 1024.0 && unit_idx < UNITS.len() - 1 {
size /= 1024.0;
unit_idx += 1;
}
if unit_idx == 0 {
format!("{} {}", bytes, UNITS[0])
} else {
format!("{:.2} {}", size, UNITS[unit_idx])
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SyncStrategy {
KeepOurs,
KeepTheirs,
Notify,
}
#[derive(Debug, Default)]
pub struct PullResult {
pub pulled: usize,
pub skipped: usize,
pub not_found: usize,
pub conflicts: Vec<String>,
}
#[derive(Debug)]
pub struct AvailableAliases<'a> {
pub sequences: &'a [String],
pub collections: &'a [String],
}
pub struct SubstringsFromRegions<'a, K>
where
K: AsRef<[u8]>,
{
pub(crate) store: &'a ReadonlyRefgetStore,
pub(crate) reader: BufReader<Box<dyn Read>>,
pub(crate) collection_digest: K,
pub(crate) previous_parsed_chr: String,
pub(crate) current_seq_digest: String,
pub(crate) line_num: usize,
}