Struct Client

Source
pub struct Client { /* private fields */ }
Expand description

Client used to authenticate and interact with Ring.

Implementations§

Source§

impl Client

Source

pub async fn login( &self, credentials: Credentials, ) -> Result<(), AuthenticationError>

Login to Ring using a set of credentials.

These credentials can either be:

§Example
§Login with a Username and Password
use ring_client::Client;

use ring_client::authentication::Credentials;
use ring_client::AuthenticationError;
use ring_client::OperatingSystem;

  let client = Client::new("Home Automation", "mock-system-id", OperatingSystem::Ios);

  let credentials = Credentials::User {
    username: "username".to_string(),
    password: "password".to_string(),
  };

  let attempt = client.login(credentials).await;

  if let Err(AuthenticationError::MfaCodeRequired) = attempt {
    // The user needs to enter a 2FA code.
    client.respond_to_challenge("123456").await.expect("Providing a valid 2FA code should not fail");
  }
  else {
    // The login was successful!
  }
§Login with a Refresh Token

If the user has previosuly logged in, Ring will have issued a refresh token. This token can be used on subsequent login attempts to avoid having to complete the full login flow (2FA, etc).

Refresh tokens can be retrieved using Client::get_refresh_token after a successful login.

use ring_client::Client;

use ring_client::authentication::Credentials;
use ring_client::OperatingSystem;

   let client = Client::new("Home Automation", "mock-system-id", OperatingSystem::Ios);

   let refresh_token = Credentials::RefreshToken("".to_string());

   client.login(refresh_token).await.expect("Logging in with a valid refresh token should not fail");
§Errors

Returns an error logging in was unsuccessful and a Two Factor Authentication (2FA) challenge was not issued.

Source

pub async fn respond_to_challenge( &self, code: &str, ) -> Result<(), AuthenticationError>

Respond to a challenge issued by Ring during the authentication process.

This is typically used to handle Two Factor Authentication (2FA) challenges

§Errors

Returns an error if the challenge could not be completed.

Source

pub async fn get_refresh_token(&self) -> Option<String>

Get the refresh token issued by Ring for the current session.

If Credentials::RefreshToken was used to login initially, this will return the same token.

Source§

impl Client

Source

pub async fn get_devices(&self) -> Result<Vec<Device>, ApiError>

Retrieve a list of devices in the Ring account.

§Examples
use ring_client::Client;

use ring_client::authentication::Credentials;
use ring_client::OperatingSystem;

let client = Client::new("Home Automation", "mock-system-id", OperatingSystem::Ios);

// For brevity, a Refresh Token is being used here. However, the client can also
// be authenticated using a username and password.
//
// See `Client::login` for more information.
let refresh_token = Credentials::RefreshToken("".to_string());

client.login(refresh_token)
     .await
     .expect("Logging in with a valid refresh token should not fail");

let devices = client.get_devices()
     .await
     .expect("Getting devices not fail");

println!("{:#?}", devices);
§Errors

Returns an error if the API request fails. This may occur either as the result of an API error, or if the authentication token needs to be refreshed and it is not successful.

Source§

impl Client

Source

pub async fn get_locations(&self) -> Result<Vec<Location<'_>>, ApiError>

Retrieve a list of locations in the Ring account.

§Examples
use ring_client::Client;

use ring_client::authentication::Credentials;
use ring_client::OperatingSystem;

let client = Client::new("Home Automation", "mock-system-id", OperatingSystem::Ios);

// For brevity, a Refresh Token is being used here. However, the client can also
// be authenticated using a username and password.
//
// See `Client::login` for more information.
let refresh_token = Credentials::RefreshToken("".to_string());

client.login(refresh_token)
     .await
     .expect("Logging in with a valid refresh token should not fail");

let locations = client.get_locations()
     .await
     .expect("Getting locations should not fail");

let location = locations
     .first()
     .expect("There should be at least one location");
§Errors

Returns an error if the API request fails. This may occur either as the result of an API error, or if the authentication token needs to be refreshed and it is not successful.

Source§

impl Client

Source

pub fn new( display_name: &str, system_id: &str, operating_system: OperatingSystem, ) -> Self

Create a new client.

The system ID is used by Ring to identify the client on subsequent logins, and should be predictable and consistent per device.

Trait Implementations§

Source§

impl Debug for Client

Source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl !Freeze for Client

§

impl !RefUnwindSafe for Client

§

impl Send for Client

§

impl Sync for Client

§

impl Unpin for Client

§

impl !UnwindSafe for Client

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.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

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

Source§

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>,

Source§

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.
Source§

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

Source§

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
Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> MaybeSendSync for T