use std::path::PathBuf;
use thiserror::Error;
use crate::{
constants::IANA_PORT, hgtp::*, AvesterraError, ConvertValueError, String255TooLongError,
};
pub struct SessionConfig {
pub address: String,
pub port: u16,
pub pem_filepath: PathBuf,
}
impl Default for SessionConfig {
fn default() -> Self {
Self {
address: "127.0.0.1".to_string(),
port: IANA_PORT,
pem_filepath: PathBuf::from("/AvesTerra/Certificates/avesterra.pem"),
}
}
}
pub trait SessionTrait: Sized + Clone {
fn get_async_session(&self) -> &SessionAsync;
fn get_socket_pool(&self) -> &HGTPPool;
}
mod asynchronous;
pub use asynchronous::SessionAsync;
mod synchronous;
pub use synchronous::Session;
#[derive(Error, Debug)]
pub enum CallError {
#[error(transparent)]
IO(#[from] std::io::Error),
#[error(transparent)]
InvalidResponse(#[from] InvalidResponse),
#[error(transparent)]
Avesterra(#[from] AvesterraError),
}
impl From<UnpackError> for CallError {
fn from(e: UnpackError) -> Self {
Self::InvalidResponse(e.into())
}
}
impl From<ConvertValueError> for CallError {
fn from(e: ConvertValueError) -> Self {
Self::InvalidResponse(e.into())
}
}
#[derive(Error, Debug)]
pub enum InvalidResponse {
#[error("received invalid HGTP frame: {0}")]
HGTPFrame(#[from] UnpackError),
#[error("received invalid value: {0}")]
ValueTag(#[from] ConvertValueError),
#[error("failed to deserialize value: {0}")]
ValueDeser(#[from] serde_json::Error),
#[error("received invalid name: {0}")]
Name(#[source] String255TooLongError),
#[error("received invalid key: {0}")]
Key(#[source] String255TooLongError),
#[error("received attribute value not in taxonomy: {0}")]
Attribute(i64),
}
mod api;
pub use api::*;