reasoninglayer 1.0.3

Rust client SDK for the Reasoning Layer API
Documentation
//! Query operations — unification, structured search, validation, natural language.

use crate::error::Error;
use crate::http::HttpClient;
use crate::types::common::RequestOptions;
use crate::types::query::{
    FindBySortRequest, NlQueryRequest, NlQueryResponse, OsfSearchRequest, OsfSearchResponse,
    TermListResponse, UnifiableQueryRequest, UnificationQueryResponse, ValidateTermRequest,
    ValidatedUnifyRequest,
};
use crate::types::terms::{TermDto, ValidatedTermResponse, ValidatedUnifyResponse};

/// Resource client for query operations.
///
/// Unifiable / by-sort / OSF-search / validate-term / validated-unify all use the tagged
/// [`ValueDto`](crate::types::values::ValueDto) format (the term CRUD format), not the untagged
/// inference format.
#[derive(Debug, Clone)]
pub struct QueryClient {
    http: HttpClient,
}

impl QueryClient {
    pub(crate) fn new(http: HttpClient) -> Self {
        Self { http }
    }

    /// Find terms that unify with a given pattern.
    pub async fn find_unifiable(
        &self,
        request: UnifiableQueryRequest,
        options: Option<&RequestOptions>,
    ) -> Result<Vec<TermDto>, Error> {
        let response: UnificationQueryResponse = self
            .http
            .post("/query/unifiable", &request, options)
            .await?;
        Ok(response.results)
    }

    /// Find terms by sort ID or sort name, with optional filter.
    pub async fn find_by_sort(
        &self,
        request: FindBySortRequest,
        options: Option<&RequestOptions>,
    ) -> Result<Vec<TermDto>, Error> {
        let response: TermListResponse =
            self.http.post("/query/by-sort", &request, options).await?;
        Ok(response.terms)
    }

    /// Execute an order-sorted feature structured search.
    pub async fn osf_search(
        &self,
        request: OsfSearchRequest,
        options: Option<&RequestOptions>,
    ) -> Result<OsfSearchResponse, Error> {
        self.http.post("/query/osf-search", &request, options).await
    }

    /// Validate a term against its sort's type witnesses.
    pub async fn validate_term(
        &self,
        request: ValidateTermRequest,
        options: Option<&RequestOptions>,
    ) -> Result<ValidatedTermResponse, Error> {
        self.http
            .post("/query/validate-term", &request, options)
            .await
    }

    /// Perform validated unification of two terms.
    pub async fn validated_unify(
        &self,
        request: ValidatedUnifyRequest,
        options: Option<&RequestOptions>,
    ) -> Result<ValidatedUnifyResponse, Error> {
        self.http
            .post("/query/validated-unify", &request, options)
            .await
    }

    /// Execute a natural language query.
    pub async fn nl_query(
        &self,
        request: NlQueryRequest,
        options: Option<&RequestOptions>,
    ) -> Result<NlQueryResponse, Error> {
        self.http.post("/nl/query", &request, options).await
    }

    /// Alias for [`QueryClient::osf_search`].
    pub async fn search(
        &self,
        request: OsfSearchRequest,
        options: Option<&RequestOptions>,
    ) -> Result<OsfSearchResponse, Error> {
        self.osf_search(request, options).await
    }

    /// Alias for [`QueryClient::find_unifiable`].
    pub async fn find_matching(
        &self,
        request: UnifiableQueryRequest,
        options: Option<&RequestOptions>,
    ) -> Result<Vec<TermDto>, Error> {
        self.find_unifiable(request, options).await
    }
}