use chrono::{DateTime, NaiveDate, Utc};
use serde::{Deserialize, Serialize};
use crate::{client::WakapiClient, error::WakapiError};
#[derive(Serialize, Default)]
pub struct HeartbeatsParams {
date: NaiveDate,
}
impl HeartbeatsParams {
pub fn new(date: NaiveDate) -> HeartbeatsParams {
HeartbeatsParams { date }
}
pub fn from_date_str(date: &str) -> Result<HeartbeatsParams, chrono::ParseError> {
Ok(HeartbeatsParams {
date: NaiveDate::parse_from_str(date, "%Y-%m-%d")?,
})
}
}
#[derive(Deserialize, Debug)]
pub struct Heartbeats {
pub data: Vec<Heartbeat>,
pub start: DateTime<Utc>,
pub end: DateTime<Utc>,
pub timezone: String,
}
#[derive(Deserialize, Debug)]
pub struct Heartbeat {
pub entity: String,
#[serde(rename = "type")]
pub entity_type: String,
pub category: String,
pub time: f64,
pub project: Option<String>,
pub project_root_count: Option<usize>,
pub branch: Option<String>,
pub language: Option<String>,
pub dependencies: Option<String>,
pub machine_name_id: String,
pub ai_line_changes: Option<i64>,
pub human_line_changes: Option<i64>,
pub ai_session: Option<String>,
pub ai_input_tokens: Option<i64>,
pub ai_output_tokens: Option<i64>,
pub ai_prompt_length: Option<i64>,
pub ai_subscription_plan: Option<String>,
pub lines: Option<usize>,
pub lineno: Option<usize>,
pub cursorpos: Option<usize>,
pub is_write: bool,
}
impl Heartbeats {
#[cfg(feature = "blocking")]
pub fn fetch(client: &WakapiClient, params: HeartbeatsParams) -> Result<Self, WakapiError> {
let url = client.build_url(
"/api/v1/users/:user/heartbeats",
Some(serde_url_params::to_string(¶ms)?),
);
let response = reqwest::blocking::Client::new()
.get(&url)
.header("Authorization", client.get_auth_header())
.send()?;
if response.status().is_success() {
let body = response.json::<Heartbeats>()?;
Ok(body)
} else {
let error = response.json::<crate::error::ErrorMessage>()?;
Err(WakapiError::ResponseError(error))
}
}
#[cfg(not(feature = "blocking"))]
pub async fn fetch(
client: &WakapiClient,
params: HeartbeatsParams,
) -> Result<Self, WakapiError> {
let url = client.build_url(
"/api/v1/users/:user/heartbeats",
Some(serde_url_params::to_string(¶ms)?),
);
let response = reqwest::Client::new()
.get(&url)
.header("Authorization", client.get_auth_header())
.send()
.await?;
if response.status().is_success() {
let body = response.json::<Heartbeats>().await?;
Ok(body)
} else {
let error = response.json::<crate::error::ErrorMessage>().await?;
Err(WakapiError::ResponseError(error))
}
}
}