Struct libdav::CalDavClient

source ·
pub struct CalDavClient<C>
where C: Connect + Clone + Sync + Send + 'static,
{ /* private fields */ }
Expand description

Client to communicate with a caldav server.

Instances are usually created via a ClientBuilder, which can also automatically bootstrap the exact host and context path.

use http::Uri;
use libdav::auth::{Auth, Password};
use hyper_rustls::HttpsConnectorBuilder;

let uri = Uri::try_from("https://example.com").unwrap();
let auth = Auth::Basic {
    username: String::from("user"),
    password: Some(Password::from("secret")),
};

let https = HttpsConnectorBuilder::new()
    .with_native_roots()
    .unwrap()
    .https_or_http()
    .enable_http1()
    .build();
let client = CalDavClient::builder()
    .with_uri(uri)
    .with_auth(auth)
    .bootstrap(https)
    .await
    .unwrap()
    .build();

Implementations§

source§

impl<C> CalDavClient<C>
where C: Connect + Clone + Sync + Send,

source

pub fn builder() -> ClientBuilder<Self, NeedsUri>

Creates a new builder. See ClientBuilder for details.

source

pub fn calendar_home_set(&self) -> Option<&Uri>

The home set found during discovery (if any) or explicitly provided during client creation.

This function does not perform any network operations; it merely returns the already-known URL.

source

pub async fn find_calendars( &self, url: Option<&Uri> ) -> Result<Vec<FoundCollection>, DavError>

Find calendars collections under the given url.

If url is not specified, this client’s calendar home set is used instead. If no calendar home set has been found, then the server’s context path will be used. When using a client bootstrapped via automatic discovery, passing None will usually yield the expected results.

Errors

If the HTTP call fails or parsing the XML response fails.

source

pub async fn get_calendar_colour( &self, href: &str ) -> Result<Option<String>, DavError>

Returns the colour for the calendar at path href.

This is not a formally standardised property, but is relatively widespread.

Quirks

The namespace of the value in the response from the server is ignored. This is a workaround for an issue in the cyrus-imapd implemenetation.

Errors

If the network request fails, or if the response cannot be parsed.

source

pub async fn set_calendar_colour( &self, href: &str, colour: Option<&str> ) -> Result<(), DavError>

Sets the colour for a collection

This is not a formally standardised property, but is relatively widespread.

The colour string should be an unescaped hex value with a leading pound sign (e.g. #ff0000).

Errors

If there are any network errors or the response could not be parsed.

source

pub async fn get_calendar_resources( &self, calendar_href: impl AsRef<str>, hrefs: impl IntoIterator<Item = impl AsRef<str>> ) -> Result<Vec<FetchedResource>, DavError>

Fetches existing icalendar resources.

If the getetag property is missing for an item, it will be reported as http::StatusCode::NOT_FOUND. This should not be an actual issue with in practice, since support for getetag is mandatory for CalDav implementations.

Errors

If there are any network errors or the response could not be parsed.

source

pub async fn check_support(&self, url: &Uri) -> Result<(), CheckSupportError>

Checks that the given URI advertises caldav support.

See: https://www.rfc-editor.org/rfc/rfc4791#section-5.1

Known Issues
  • This is currently broken on Nextcloud. Bug report.
Errors

If there are any network issues or if the server does not explicitly advertise caldav support.

source

pub async fn create_calendar( &self, href: impl AsRef<str> ) -> Result<(), DavError>

Create an calendar collection.

Errors

Returns an error in case of network errors or if the server returns a failure status code.

Methods from Deref<Target = WebDavClient<C>>§

source

pub fn base_url(&self) -> &Uri

Returns a URL pointing to the server’s context path.

source

pub fn relative_uri(&self, path: impl AsRef<str>) -> Result<Uri, Error>

Returns a new URI relative to the server’s root.

Errors

If this client’s base_url is invalid or the provided path is not an acceptable path.

source

pub async fn find_current_user_principal( &self ) -> Result<Option<Uri>, FindCurrentUserPrincipalError>

Resolves the current user’s principal resource.

Returns None if the response’s status code is 404 or if no principal was found.

Errors
  • If the underlying HTTP request fails.
  • If the response status code is neither success nor 404.
  • If parsing the XML response fails.
  • If the href cannot be parsed into a valid Uri
See also
source

pub async fn propfind( &self, url: &Uri, properties: &[&Property<'_, '_>], depth: u8 ) -> Result<(Parts, Bytes), DavError>

Sends a PROPFIND request.

This is a shortcut for simple PROPFIND requests.

Errors

If there are any network errors.

source

pub async fn request( &self, request: Request<Body> ) -> Result<(Parts, Bytes), RequestError>

Send a request to the server.

Sends a request, applying any necessary authentication and logging the response.

Errors

Returns an error if the underlying http request fails or if streaming the response fails.

source

pub async fn get_collection_displayname( &self, href: &str ) -> Result<Option<String>, DavError>

Returns the displayname for the collection at path href.

From rfc3744#section-4:

A principal MUST have a non-empty DAV:displayname property

Errors

If there are any network errors or the response could not be parsed.

source

pub async fn propupdate( &self, url: &Uri, property: &Property<'_, '_>, value: Option<&str> ) -> Result<(), DavError>

Sends a PROPUPDATE query to the server.

Errors

If there are any network errors or the response could not be parsed.

source

pub async fn set_collection_displayname( &self, href: &str, displayname: Option<&str> ) -> Result<(), DavError>

Sets the displayname for a collection

The displayname string is expected not to be escaped.

Errors

If there are any network errors or the response could not be parsed.

source

pub async fn find_context_path( &self, service: DiscoverableService, host: &str, port: u16 ) -> Result<Option<Uri>, ResolveContextPathError>

Resolve the default context path using a well-known path.

This only applies for servers supporting webdav extensions like caldav or carddav.

Errors
  • If the provided scheme, host and port cannot be used to construct a valid URL.
  • If there are any network errors.
  • If the response is not an HTTP redirection.
  • If the Location header in the response is missing or invalid.
See also
source

pub async fn list_resources( &self, collection_href: &str ) -> Result<Vec<ListedResource>, DavError>

Enumerates resources in a collection

Returns an array of results.

Errors

If there are any network errors or the response could not be parsed.

source

pub async fn create_resource( &self, href: impl AsRef<str>, data: Vec<u8>, mime_type: impl AsRef<[u8]> ) -> Result<Option<String>, DavError>

Creates a new resource

Returns an Etag if present in the server’s response.

Errors

If there are any network errors or the response could not be parsed.

source

pub async fn update_resource( &self, href: impl AsRef<str>, data: Vec<u8>, etag: impl AsRef<str>, mime_type: impl AsRef<[u8]> ) -> Result<Option<String>, DavError>

Updates an existing resource

Returns an Etag if present in the server’s response.

Errors

If there are any network errors or the response could not be parsed.

source

pub async fn create_collection( &self, href: impl AsRef<str>, resourcetypes: &[&Property<'_, '_>] ) -> Result<(), DavError>

Creates a collection under path href.

This function executes an Extended MKCOL.

Additional resource types may be specified via the resourcetypes argument. The DAV:collection resource type is implied and MUST NOT be specified.

Caveats

Because servers commonly don’t return an Etag for this operation, it needs to be fetched in a separate operation.

Errors

If there are any network errors or the response could not be parsed.

source

pub async fn delete( &self, href: impl AsRef<str>, etag: impl AsRef<str> ) -> Result<(), DavError>

Deletes the resource at href.

The resource MAY be a collection. Because the implementation for deleting resources and collections is identical, this same function is used for both cases.

If the Etag does not match (i.e.: if the resource has been altered), the operation will fail and return an Error.

Errors

If there are any network errors or the response could not be parsed.

source

pub async fn force_delete(&self, href: impl AsRef<str>) -> Result<(), DavError>

Force deletion of the resource at href.

This function does not guarantee that a resource or collection has not been modified since it was last read. Use this function with great care.

The resource MAY be a collection. Because the implementation for deleting resources and collections is identical, this same method covers both cases.

Errors

If there are any network errors or the response could not be parsed.

Trait Implementations§

source§

impl<C> Clone for CalDavClient<C>
where C: Connect + Clone + Sync + Send + 'static + Clone,

source§

fn clone(&self) -> CalDavClient<C>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<C> Debug for CalDavClient<C>
where C: Connect + Clone + Sync + Send + 'static + Debug,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<C> Deref for CalDavClient<C>
where C: Connect + Clone + Sync + Send,

§

type Target = WebDavClient<C>

The resulting type after dereferencing.
source§

fn deref(&self) -> &Self::Target

Dereferences the value.

Auto Trait Implementations§

§

impl<C> !RefUnwindSafe for CalDavClient<C>

§

impl<C> Send for CalDavClient<C>

§

impl<C> Sync for CalDavClient<C>

§

impl<C> Unpin for CalDavClient<C>
where C: Unpin,

§

impl<C> !UnwindSafe for CalDavClient<C>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<Source, Target> OctetsInto<Target> for Source
where Target: OctetsFrom<Source>,

§

type Error = <Target as OctetsFrom<Source>>::Error

§

fn try_octets_into( self ) -> Result<Target, <Source as OctetsInto<Target>>::Error>

Performs the conversion.
§

fn octets_into(self) -> Target
where Self::Error: Into<Infallible>,

Performs an infallible conversion.
source§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more