use crate::fs::{Share, SmbClient, SmbClientBuilder};
use smolder_core::prelude::CoreError;
use smolder_proto::smb::smb2::{Dialect, GlobalCapabilities, SigningMode};
#[derive(Debug, Clone)]
pub struct ShareReconnectPlan {
builder: SmbClientBuilder,
share: String,
}
impl ShareReconnectPlan {
#[must_use]
pub fn from_builder(builder: SmbClientBuilder, share: impl Into<String>) -> Self {
Self {
builder,
share: share.into(),
}
}
#[must_use]
pub fn new(
server: impl Into<String>,
share: impl Into<String>,
credentials: smolder_core::prelude::NtlmCredentials,
) -> Self {
Self::from_builder(
SmbClient::builder()
.server(server.into())
.credentials(credentials),
share,
)
}
#[must_use]
pub fn server(mut self, server: impl Into<String>) -> Self {
self.builder = self.builder.server(server.into());
self
}
#[must_use]
pub fn share(mut self, share: impl Into<String>) -> Self {
self.share = share.into();
self
}
#[must_use]
pub fn port(mut self, port: u16) -> Self {
self.builder = self.builder.port(port);
self
}
#[must_use]
pub fn credentials(mut self, credentials: smolder_core::prelude::NtlmCredentials) -> Self {
self.builder = self.builder.credentials(credentials);
self
}
#[must_use]
pub fn dialects(mut self, dialects: Vec<Dialect>) -> Self {
self.builder = self.builder.dialects(dialects);
self
}
#[must_use]
pub fn signing_mode(mut self, signing_mode: SigningMode) -> Self {
self.builder = self.builder.signing_mode(signing_mode);
self
}
#[must_use]
pub fn capabilities(mut self, capabilities: GlobalCapabilities) -> Self {
self.builder = self.builder.capabilities(capabilities);
self
}
#[must_use]
pub fn client_guid(mut self, client_guid: [u8; 16]) -> Self {
self.builder = self.builder.client_guid(client_guid);
self
}
#[must_use]
pub fn transfer_chunk_size(mut self, transfer_chunk_size: u32) -> Self {
self.builder = self.builder.transfer_chunk_size(transfer_chunk_size);
self
}
#[must_use]
pub fn share_name(&self) -> &str {
&self.share
}
pub async fn connect(&self) -> Result<Share, CoreError> {
let client = self.builder.clone().connect().await?;
client.share(self.share.clone()).await
}
}