pub mod acl;
pub mod client;
pub mod container;
pub mod error;
pub mod object;
pub mod types;
pub use client::NeoFSClient;
pub use error::{NeoFSError, NeoFSResult};
pub use acl::{BearerToken, SessionToken};
pub use container::Container;
pub use object::{MultipartUpload, MultipartUploadResult, Object, Part};
pub use types::{
AccessPermission, Attributes, ContainerId, ObjectId, ObjectType, OwnerId, PlacementPolicy,
};
use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use std::fmt;
pub const DEFAULT_MAINNET_ENDPOINT: &str = "grpc.mainnet.fs.neo.org:8082";
pub const DEFAULT_TESTNET_ENDPOINT: &str = "grpc.testnet.fs.neo.org:8082";
pub const DEFAULT_ENDPOINT: &str = DEFAULT_MAINNET_ENDPOINT;
pub const DEFAULT_MAINNET_HTTP_GATEWAY: &str = "https://http.mainnet.fs.neo.org";
pub const DEFAULT_TESTNET_HTTP_GATEWAY: &str = "https://http.testnet.fs.neo.org";
pub const DEFAULT_MAINNET_REST_API: &str = "https://rest.mainnet.fs.neo.org";
pub const DEFAULT_TESTNET_REST_API: &str = "https://rest.testnet.fs.neo.org";
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct NeoFSConfig {
pub endpoint: String,
pub auth: Option<NeoFSAuth>,
pub timeout_sec: u64,
pub insecure: bool,
}
impl NeoFSConfig {
pub fn builder() -> NeoFSConfigBuilder {
NeoFSConfigBuilder::default()
}
}
#[derive(Debug, Default, Clone)]
pub struct NeoFSConfigBuilder {
endpoint: Option<String>,
auth: Option<NeoFSAuth>,
timeout_sec: Option<u64>,
insecure: Option<bool>,
}
impl NeoFSConfigBuilder {
pub fn endpoint(mut self, val: String) -> Self {
self.endpoint = Some(val);
self
}
pub fn auth(mut self, val: NeoFSAuth) -> Self {
self.auth = Some(val);
self
}
pub fn timeout_sec(mut self, val: u64) -> Self {
self.timeout_sec = Some(val);
self
}
pub fn insecure(mut self, val: bool) -> Self {
self.insecure = Some(val);
self
}
pub fn build(self) -> NeoFSConfig {
let default = NeoFSConfig::default();
NeoFSConfig {
endpoint: self.endpoint.unwrap_or(default.endpoint),
auth: self.auth.or(default.auth),
timeout_sec: self.timeout_sec.unwrap_or(default.timeout_sec),
insecure: self.insecure.unwrap_or(default.insecure),
}
}
}
impl Default for NeoFSConfig {
fn default() -> Self {
Self {
endpoint: DEFAULT_TESTNET_REST_API.to_string(),
auth: None,
timeout_sec: 60,
insecure: false,
}
}
}
#[derive(Clone, Serialize, Deserialize)]
pub struct NeoFSAuth {
pub wallet_address: String,
pub private_key: Option<String>,
}
impl fmt::Debug for NeoFSAuth {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("NeoFSAuth")
.field("wallet_address", &self.wallet_address)
.field("private_key", &self.private_key.as_ref().map(|_| "<redacted>"))
.finish()
}
}
#[async_trait]
pub trait NeoFSService {
async fn create_container(&self, container: &Container) -> NeoFSResult<ContainerId>;
async fn get_container(&self, id: &ContainerId) -> NeoFSResult<Container>;
async fn list_containers(&self) -> NeoFSResult<Vec<ContainerId>>;
async fn delete_container(&self, id: &ContainerId) -> NeoFSResult<bool>;
async fn put_object(
&self,
container_id: &ContainerId,
object: &Object,
) -> NeoFSResult<ObjectId>;
async fn get_object(
&self,
container_id: &ContainerId,
object_id: &ObjectId,
) -> NeoFSResult<Object>;
async fn list_objects(&self, container_id: &ContainerId) -> NeoFSResult<Vec<ObjectId>>;
async fn delete_object(
&self,
container_id: &ContainerId,
object_id: &ObjectId,
) -> NeoFSResult<bool>;
async fn create_bearer_token(
&self,
container_id: &ContainerId,
permissions: Vec<AccessPermission>,
expires_sec: u64,
) -> NeoFSResult<BearerToken>;
async fn get_session_token(&self) -> NeoFSResult<SessionToken>;
async fn initiate_multipart_upload(
&self,
container_id: &ContainerId,
object: &Object,
) -> NeoFSResult<MultipartUpload>;
async fn upload_part(
&self,
upload: &MultipartUpload,
part_number: u32,
data: Vec<u8>,
) -> NeoFSResult<Part>;
async fn complete_multipart_upload(
&self,
upload: &MultipartUpload,
parts: Vec<Part>,
) -> NeoFSResult<MultipartUploadResult>;
async fn abort_multipart_upload(&self, upload: &MultipartUpload) -> NeoFSResult<bool>;
}