use refget_model::SequenceMetadata;
use refget_store::{SequenceStore, StoreError, StoreResult};
use crate::RefgetClientBlocking;
use crate::error::ClientError;
pub struct RemoteSequenceStore {
client: RefgetClientBlocking,
}
impl RemoteSequenceStore {
pub fn new(base_url: &str) -> Result<Self, ClientError> {
Ok(Self { client: RefgetClientBlocking::new(base_url)? })
}
pub fn from_client(client: RefgetClientBlocking) -> Self {
Self { client }
}
}
fn map_error(e: ClientError) -> StoreError {
match e {
ClientError::NotFound(msg) => StoreError::NotFound(msg),
other => StoreError::Io(std::io::Error::other(other.to_string())),
}
}
impl SequenceStore for RemoteSequenceStore {
fn get_sequence(
&self,
digest: &str,
start: Option<u64>,
end: Option<u64>,
) -> StoreResult<Option<Vec<u8>>> {
self.client.get_sequence(digest, start, end).map_err(map_error)
}
fn get_metadata(&self, digest: &str) -> StoreResult<Option<SequenceMetadata>> {
self.client.get_metadata(digest).map_err(map_error)
}
fn get_length(&self, digest: &str) -> StoreResult<Option<u64>> {
match self.client.get_metadata(digest).map_err(map_error)? {
Some(meta) => Ok(Some(meta.length)),
None => Ok(None),
}
}
}