pub trait RpcService: Send + Sync + 'static {
    // Required methods
    fn get_by_id<'life0, 'async_trait>(
        &'life0 self,
        request: Request<Id>
    ) -> Pin<Box<dyn Future<Output = Result<Response<Object>, Status>> + Send + 'async_trait>>
       where Self: 'async_trait,
             'life0: 'async_trait;
    fn insert<'life0, 'async_trait>(
        &'life0 self,
        request: Request<Data>
    ) -> Pin<Box<dyn Future<Output = Result<Response<Response>, Status>> + Send + 'async_trait>>
       where Self: 'async_trait,
             'life0: 'async_trait;
    fn update<'life0, 'async_trait>(
        &'life0 self,
        request: Request<UpdateObject>
    ) -> Pin<Box<dyn Future<Output = Result<Response<Response>, Status>> + Send + 'async_trait>>
       where Self: 'async_trait,
             'life0: 'async_trait;
    fn delete<'life0, 'async_trait>(
        &'life0 self,
        request: Request<Id>
    ) -> Pin<Box<dyn Future<Output = Result<Response<()>, Status>> + Send + 'async_trait>>
       where Self: 'async_trait,
             'life0: 'async_trait;
    fn search<'life0, 'async_trait>(
        &'life0 self,
        request: Request<AdvancedSearchFilter>
    ) -> Pin<Box<dyn Future<Output = Result<Response<List>, Status>> + Send + 'async_trait>>
       where Self: 'async_trait,
             'life0: 'async_trait;
    fn is_ready<'life0, 'async_trait>(
        &'life0 self,
        request: Request<ReadyRequest>
    ) -> Pin<Box<dyn Future<Output = Result<Response<ReadyResponse>, Status>> + Send + 'async_trait>>
       where Self: 'async_trait,
             'life0: 'async_trait;
}
Expand description

Generated trait containing gRPC methods that should be implemented for use with RpcServiceServer.

Required Methods§

source

fn get_by_id<'life0, 'async_trait>( &'life0 self, request: Request<Id> ) -> Pin<Box<dyn Future<Output = Result<Response<Object>, Status>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Returns a [tonic::Response] containing an vehicle Object Takes an id to find the right record to return.

Errors

Returns [tonic::Status] with Code::NotFound if no record is returned from the database

Examples
use svc_storage_client_grpc::{Id, VehicleClient, simple_service::Client};

async fn example () -> Result<(), Box<dyn std::error::Error>> {
   let mut vehicle_client = VehicleClient::connect("http://localhost:50051").await?;

   let id = "53acfe06-dd9b-42e8-8cb4-12a2fb2fa693".to_owned();
   match vehicle_client
       .get_by_id(tonic::Request::new(Id { id }))
       .await
   {
       Ok(res) => {
         println!("RESPONSE Vehicle By ID={:?}", res);
         Ok(())
       },
       Err(e) => Err(Box::new(e))
   }
}
source

fn insert<'life0, 'async_trait>( &'life0 self, request: Request<Data> ) -> Pin<Box<dyn Future<Output = Result<Response<Response>, Status>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Returns a [tonic::Response] containing a vehicle Response object of the inserted record after saving the provided vehicle Data

The given data will be validated before insert. A new UUID will be generated by the database and returned as id as part of the returned vehicle Response. Any errors found during validation will be added to the ValidationResult.

Errors

Returns Status with Code::Internal if the [tonic::Request] doesn’t contain any data. Returns Status with Code::Internal if any error is returned from a db call.

Examples
use svc_storage_client_grpc::{Id, VehicleClient, simple_service::Client};
use svc_storage_client_grpc::vehicle::Data;

const CAL_WORKDAYS_8AM_6PM: &str = "\
DTSTART:20221020T180000Z;DURATION:PT14H
RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR
DTSTART:20221022T000000Z;DURATION:PT24H
RRULE:FREQ=WEEKLY;BYDAY=SA,SU";

async fn example () -> Result<(), Box<dyn std::error::Error>> {
   let mut vehicle_client = VehicleClient::connect("http://localhost:50051").await?;

   let model_id = uuid::Uuid::new_v4().to_string();
   let last_maintenance = prost_types::Timestamp::date_time(2022, 10, 12, 09, 00, 00).unwrap();
   let next_maintenance = prost_types::Timestamp::date_time(2023, 10, 12, 13, 30, 00).unwrap();

   println!("Starting insert vehicle");
   match vehicle_client
   .insert(tonic::Request::new(Data {
       vehicle_model_id: model_id.clone(),
       serial_number: format!("S-MOCK-1"),
       registration_number: format!("N-DEMO-1"),
       description: Some("Demo vehicle filled with Mock data".to_owned()),
       asset_group_id: None,
       schedule: Some(CAL_WORKDAYS_8AM_6PM.to_owned()),
       hangar_id: Some(uuid::Uuid::new_v4().to_string()),
       hangar_bay_id: Some(uuid::Uuid::new_v4().to_string()),
       last_maintenance: Some(last_maintenance),
       next_maintenance: Some(next_maintenance),
   }))
   .await
   {
       Ok(res) => {
         println!("RESPONSE Vehicle Insert={:?}", res);
         Ok(())
       },
       Err(e) => Err(Box::new(e))
   }
}
source

fn update<'life0, 'async_trait>( &'life0 self, request: Request<UpdateObject> ) -> Pin<Box<dyn Future<Output = Result<Response<Response>, Status>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Returns a [tonic::Response] containing a vehicle Response object of the updated record after saving the provided vehicle Data

The given data will be validated before insert. Any errors found during validation will be added to the ValidationResult. A field [prost_types::FieldMask] can be provided to restrict updates to specific fields.

Errors

Returns Status with Code::Cancelled if the Request doesn’t contain any data. Returns Status with Code::Internal if any error is returned from a db call. Returns Status with Code::Internal if the provided Id can not be converted to a [uuid::Uuid]. Returns Status with Code::Internal if the resulting Vec<tokio_postgres::Row> data could not be converted into List.

Examples
use svc_storage_client_grpc::{FieldMask, Id, VehicleClient, simple_service::Client};
use svc_storage_client_grpc::vehicle::{Data, UpdateObject};

async fn example () -> Result<(), Box<dyn std::error::Error>> {
   let mut vehicle_client = VehicleClient::connect("http://localhost:50051").await?;

   let id = "53acfe06-dd9b-42e8-8cb4-12a2fb2fa693".to_owned();
   let response = match vehicle_client
       .get_by_id(tonic::Request::new(Id { id: id.clone() }))
       .await
   {
       Ok(res) => {
         println!("RESPONSE Vehicle By ID={:?}", res);
         res
       },
       Err(e) => {
           return Err(Box::new(e));
       }
   };

   let vehicle = response.into_inner().data.unwrap();
   let next_maintenance = prost_types::Timestamp::date_time(2023, 10, 12, 15, 30, 00).unwrap();
   match vehicle_client.update(tonic::Request::new(UpdateObject {
       id,
       data: Some(Data {
           next_maintenance: Some(next_maintenance),
           ..vehicle
       }),
       mask: Some(FieldMask {
           paths: vec!["data.next_maintenance".to_owned()],
       }),
   })).await
   {
       Ok(res) => {
         println!("RESPONSE Vehicle Update={:?}", res);
         Ok(())
       },
       Err(e) => Err(Box::new(e))
   }
}
source

fn delete<'life0, 'async_trait>( &'life0 self, request: Request<Id> ) -> Pin<Box<dyn Future<Output = Result<Response<()>, Status>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Takes an Id to set the matching vehicle record as deleted in the database“

Errors

Returns Status with Code::NotFound if no record is returned from the database. Returns Status with Code::Internal if any error is returned from a db call.

Examples
use svc_storage_client_grpc::{Id, VehicleClient, simple_service::Client};

async fn example () -> Result<(), Box<dyn std::error::Error>> {
   let mut vehicle_client = VehicleClient::connect("http://localhost:50051").await?;

   let id = "53acfe06-dd9b-42e8-8cb4-12a2fb2fa693".to_owned();
   match vehicle_client.delete(tonic::Request::new(Id{id})).await
   {
       Ok(res) => {
         println!("RESPONSE Vehicle Delete={:?}", res);
         Ok(())
       },
       Err(e) => Err(Box::new(e))
   }
}
source

fn search<'life0, 'async_trait>( &'life0 self, request: Request<AdvancedSearchFilter> ) -> Pin<Box<dyn Future<Output = Result<Response<List>, Status>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Search vehicles using an advanced filter

This method supports paged results.

Errors

Returns Status with Code::Internal if any error is returned from the db search result. Returns Status with Code::Internal if the resulting Vec<tokio_postgres::Row> data could not be converted into List.

Examples
use svc_storage_client_grpc::{AdvancedSearchFilter, VehicleClient, simple_service::Client};

async fn example () -> Result<(), Box<dyn std::error::Error>> {
   let mut vehicle_client = VehicleClient::connect("http://localhost:50051").await?;

   let filter = AdvancedSearchFilter::search_equals("vehicle_model_id".to_owned(), "56045193-1f55-4abf-9148-69c76c052884".to_owned())
       .and_is_null("deleted_at".to_owned());

   match vehicle_client
       .search(tonic::Request::new(filter))
       .await
   {
       Ok(res) => {
         println!("RESPONSE Vehicle Search={:?}", res);
         Ok(())
       },
       Err(e) => Err(Box::new(e))
   }
}
source

fn is_ready<'life0, 'async_trait>( &'life0 self, request: Request<ReadyRequest> ) -> Pin<Box<dyn Future<Output = Result<Response<ReadyResponse>, Status>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Simple ready check to allow callers to validate the client connection status.

Implementors§