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)]
pub struct NeoFSConfig {
pub endpoint: String,
pub auth: Option<NeoFSAuth>,
pub timeout_sec: u64,
pub insecure: bool,
}
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>;
}