tauri-plugin-healthkit 0.1.4

A Tauri plugin for accessing HealthKit (iOS) and Health Connect (Android)
use serde::{Deserialize, Serialize};

// ============================================================================
// Status & Permissions
// ============================================================================

#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct StatusResponse {
    pub platform: String,
    pub status: String,
    pub is_available: bool,
}

#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PermissionsRequest {
    pub permissions: Vec<String>,
}

#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PermissionResult {
    pub scope: String,
    pub state: String,
}

#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PermissionsResponse {
    pub permissions: Vec<PermissionResult>,
}

// ============================================================================
// Steps
// ============================================================================

#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct StepDataRequest {
    pub since_date: String,
    pub until_date: String,
}

#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct StepRecord {
    pub recorded_at: String,
    pub value: i64,
}

#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct StepResponse {
    pub records: Vec<StepRecord>,
}

// ============================================================================
// Sleep
// ============================================================================

/// Single sleep record
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SleepRecord {
    /// Start time of sleep segment in ISO 8601 format
    pub start_time: String,
    /// End time of sleep segment in ISO 8601 format
    pub end_time: String,
    /// Raw sleep type from native layer (e.g. "hk_in_bed", "hc_deep", "unknown")
    pub sleep_type: String,
}

/// Request for querying sleep data with time range
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SleepDataRequest {
    /// Start time in ISO 8601 format (e.g., "2024-01-01T00:00:00+09:00")
    pub since_date: String,
    /// End time in ISO 8601 format (e.g., "2024-01-02T00:00:00+09:00")
    pub until_date: String,
}

/// Response for sleep data
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SleepResponse {
    pub records: Vec<SleepRecord>,
}

// ============================================================================
// Weight
// ============================================================================

/// Single weight record matching Flutter app's WeightsResponse
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct WeightRecord {
    /// Time of measurement in ISO 8601 format
    pub recorded_at: String,
    /// Weight in kilograms
    pub weight: f64,
}

/// Request for querying weight data with time range
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct WeightDataRequest {
    /// Start time in ISO 8601 format
    pub since_date: String,
    /// End time in ISO 8601 format
    pub until_date: String,
}

/// Response for weight data
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct WeightResponse {
    pub records: Vec<WeightRecord>,
}