Skip to content

Utilizing CirclesQuery (Rust Equivalent)

circles_types provides the query DSL (QueryParams, FilterPredicate, Filter, OrderBy, SortOrder, PagedQueryParams). Use it with circles_rpc::QueryMethods.

use circles_rpc::{QueryMethods, RpcClient};
use circles_types::{Conjunction, ConjunctionType, Filter, FilterPredicate, OrderBy, QueryParams};
use reqwest::Url;
use serde::Deserialize;
 
#[derive(Debug, Clone, Deserialize)]
struct ProfileRow {
    avatar: String,
    name: Option<String>,
}
 
#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let client = RpcClient::http(Url::parse("https://rpc.aboutcircles.com/")?);
    let queries = QueryMethods::new(client);
 
    let filter = Conjunction::and(vec![
        FilterPredicate::like("name".into(), "Al%".into()).into(),
        FilterPredicate::equals(
            "avatar".into(),
            "0x1234567890123456789012345678901234567890",
        )
        .into(),
    ])
    .into();
 
    let params = QueryParams {
        namespace: "circles".into(),
        table: "profiles".into(),
        columns: vec!["avatar".into(), "name".into()],
        filter: vec![filter],
        order: vec![OrderBy::asc("avatar".into())],
        limit: Some(20),
    };
 
    let rows: Vec<ProfileRow> = queries.circles_query(params).await?;
    println!("rows: {}", rows.len());
    Ok(())
}