tauri-plugin-healthkit 0.1.3

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 matching Flutter app's SleepResponse
#[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,
    /// Sleep type: "deep", "light", "rem", "awake", "wake", "asleep", "restless", "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>,
}