blob: 4b6b372d103c918b349ca0928b252ec9e830c0c3 [file] [log] [blame]
use crate::{
schema::{DatabaseSchema, MonitorRequest, TableUpdate},
transports::{ipc, tcp},
};
use jsonrpsee::{async_client::ClientBuilder, core::client::SubscriptionClientT, proc_macros::rpc};
use std::{collections::HashMap, path::Path};
use tokio::net::ToSocketAddrs;
#[rpc(client)]
pub trait Rpc {
/// 4.1.1. List Databases
///
/// This operation retrieves an array whose elements are the names of the
/// databases that can be accessed over this management protocol
/// connection.
#[method(name = "list_dbs")]
async fn list_databases(&self) -> Result<Vec<String>, ErrorObjectOwned>;
/// 4.1.2. Get Schema
///
/// This operation retrieves a <database-schema> that describes hosted
/// database <db-name>.
#[method(name = "get_schema")]
async fn get_schema(&self, db_name: &str) -> Result<DatabaseSchema, ErrorObjectOwned>;
/// 4.1.5. Monitor
///
/// The "monitor" request enables a client to replicate tables or subsets
/// of tables within an OVSDB database by requesting notifications of
/// changes to those tables and by receiving the complete initial state
/// of a table or a subset of a table.
#[method(name = "monitor")]
async fn monitor(
&self,
db_name: &str,
matcher: Option<&str>,
requests: HashMap<String, MonitorRequest>,
) -> Result<TableUpdate<serde_json::Value>, ErrorObjectOwned>;
}
pub async fn connect_tcp(
tcp: impl ToSocketAddrs,
) -> Result<impl SubscriptionClientT, std::io::Error> {
let (sender, receiver) = tcp::connect(tcp).await?;
Ok(ClientBuilder::default().build_with_tokio(sender, receiver))
}
pub async fn connect_unix(
socket_path: impl AsRef<Path>,
) -> Result<impl SubscriptionClientT, std::io::Error> {
let (sender, receiver) = ipc::connect(socket_path).await?;
Ok(ClientBuilder::default().build_with_tokio(sender, receiver))
}