haply 1.1.0

Haply Robotics Client Library for the Inverse Service
Documentation
//! SDF HFX HTTP endpoints — device-scoped and flat routes.
//! All methods are `impl InverseHttpClient`.

use crate::device_model::{SdfCommand, SdfHfxData, SdfHfxObject, SdfObjectList};

use super::client::InverseHttpClient;

impl InverseHttpClient {
    // ============================================================
    // Device-scoped SDF routes: /{type}/{id}/sdf?session=<expr>
    // ============================================================

    /// List all SDF effects for a device/session. `GET /{type}/{id}/sdf?session=<expr>`
    pub async fn get_sdf(
        &self,
        device_type: &str,
        id: &str,
        session: Option<&str>,
    ) -> Result<Vec<SdfHfxData>, Box<dyn std::error::Error + Send + Sync>> {
        let mut url = self.device_url(device_type, id, "sdf");
        Self::append_session(&mut url, session);
        self.request_envelope(self.client.get(&url)).await
    }

    /// Get a single SDF effect by ID. `GET /{type}/{id}/sdf/{hfx_id}?session=<expr>`
    pub async fn get_sdf_by_id(
        &self,
        device_type: &str,
        id: &str,
        hfx_id: &str,
        session: Option<&str>,
    ) -> Result<SdfHfxData, Box<dyn std::error::Error + Send + Sync>> {
        let mut url = format!("{}/{}/{}/sdf/{}", self.base_url, device_type, id, hfx_id);
        Self::append_session(&mut url, session);
        self.request_envelope(self.client.get(&url)).await
    }

    /// Bulk set (atomic replace) SDF effects. `POST /{type}/{id}/sdf?session=<expr>`
    pub async fn set_sdf(
        &self,
        device_type: &str,
        id: &str,
        session: Option<&str>,
        cmd: &SdfCommand,
    ) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
        let mut url = self.device_url(device_type, id, "sdf");
        Self::append_session(&mut url, session);
        self.request_envelope_void(self.client.post(&url).json(cmd))
            .await
    }

    /// Single-item full replacement by ID. `POST /{type}/{id}/sdf/{hfx_id}?session=<expr>`
    pub async fn set_sdf_by_id(
        &self,
        device_type: &str,
        id: &str,
        hfx_id: &str,
        session: Option<&str>,
        obj: &SdfHfxObject,
    ) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
        let mut url = format!("{}/{}/{}/sdf/{}", self.base_url, device_type, id, hfx_id);
        Self::append_session(&mut url, session);
        self.request_envelope_void(self.client.post(&url).json(obj))
            .await
    }

    /// Bulk partial update. `PATCH /{type}/{id}/sdf?session=<expr>`
    pub async fn patch_sdf(
        &self,
        device_type: &str,
        id: &str,
        session: Option<&str>,
        cmd: &SdfCommand,
    ) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
        let mut url = self.device_url(device_type, id, "sdf");
        Self::append_session(&mut url, session);
        self.request_envelope_void(self.client.patch(&url).json(cmd))
            .await
    }

    /// Single-item partial update by ID. `PATCH /{type}/{id}/sdf/{hfx_id}?session=<expr>`
    pub async fn patch_sdf_by_id(
        &self,
        device_type: &str,
        id: &str,
        hfx_id: &str,
        session: Option<&str>,
        obj: &SdfHfxObject,
    ) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
        let mut url = format!("{}/{}/{}/sdf/{}", self.base_url, device_type, id, hfx_id);
        Self::append_session(&mut url, session);
        self.request_envelope_void(self.client.patch(&url).json(obj))
            .await
    }

    /// Delete all SDF effects for a device/session. `DELETE /{type}/{id}/sdf?session=<expr>`
    pub async fn delete_sdf(
        &self,
        device_type: &str,
        id: &str,
        session: Option<&str>,
    ) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
        let mut url = self.device_url(device_type, id, "sdf");
        Self::append_session(&mut url, session);
        self.request_envelope_void(self.client.delete(&url)).await
    }

    /// Delete a single SDF effect by ID. `DELETE /{type}/{id}/sdf/{hfx_id}?session=<expr>`
    pub async fn delete_sdf_by_id(
        &self,
        device_type: &str,
        id: &str,
        hfx_id: &str,
        session: Option<&str>,
    ) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
        let mut url = format!("{}/{}/{}/sdf/{}", self.base_url, device_type, id, hfx_id);
        Self::append_session(&mut url, session);
        self.request_envelope_void(self.client.delete(&url)).await
    }

    // ============================================================
    // Flat SDF routes: /sdf
    // ============================================================

    /// Get all SDF effects across all sessions. `GET /sdf`
    pub async fn get_all_sdf(
        &self,
    ) -> Result<Vec<SdfHfxData>, Box<dyn std::error::Error + Send + Sync>> {
        let url = format!("{}/sdf", self.base_url);
        self.request_envelope(self.client.get(&url)).await
    }

    /// Full replacement across sessions. `POST /sdf`
    /// Each item routes by its `session_id` and `devices` fields.
    pub async fn set_all_sdf(
        &self,
        list: &SdfObjectList,
    ) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
        let url = format!("{}/sdf", self.base_url);
        self.request_envelope_void(self.client.post(&url).json(list))
            .await
    }

    /// Partial update across sessions. `PATCH /sdf`
    pub async fn patch_all_sdf(
        &self,
        list: &SdfObjectList,
    ) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
        let url = format!("{}/sdf", self.base_url);
        self.request_envelope_void(self.client.patch(&url).json(list))
            .await
    }

    /// Delete all SDF effects across all sessions. `DELETE /sdf`
    pub async fn delete_all_sdf(
        &self,
    ) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
        let url = format!("{}/sdf", self.base_url);
        self.request_envelope_void(self.client.delete(&url)).await
    }
}