use schemars::JsonSchema;
use serde::Deserialize;
#[derive(Deserialize, JsonSchema)]
pub struct ProjectArgs {
pub project: Option<String>,
}
#[derive(Deserialize, JsonSchema)]
pub struct ListArgs {
pub project: Option<String>,
pub state: Option<String>,
}
#[derive(Deserialize, JsonSchema)]
pub struct IdArgs {
pub issue_id: String,
}
#[derive(Deserialize, JsonSchema)]
pub struct CreateArgs {
pub project: String,
pub title: String,
pub priority: Option<String>,
pub issue_type: Option<String>,
pub tags: Option<String>,
pub parent: Option<String>,
pub body: Option<String>,
}
#[derive(Deserialize, JsonSchema)]
pub struct UpdateArgs {
pub issue_id: String,
pub state: Option<String>,
pub priority: Option<String>,
pub block: Option<String>,
pub unblock: Option<String>,
pub if_state: Option<String>,
pub if_gen: Option<u64>,
}
#[derive(Deserialize, JsonSchema)]
pub struct ResolveArgs {
pub issue_id: String,
pub state: String,
}
#[derive(Deserialize, JsonSchema)]
pub struct CountArgs {
pub project: Option<String>,
pub state: Option<String>,
pub ready: Option<bool>,
}
#[derive(Deserialize, JsonSchema)]
pub struct SearchArgs {
pub query: String,
pub limit: Option<usize>,
}
#[derive(Deserialize, JsonSchema)]
pub struct RelatedArgs {
pub issue_id: String,
pub depth: Option<usize>,
pub limit: Option<usize>,
pub format: Option<String>,
}
#[derive(Deserialize, JsonSchema)]
pub struct TreeArgs {
pub issue_id: String,
pub format: Option<String>,
}
#[derive(Deserialize, JsonSchema)]
pub struct MirrorArgs {
pub projects: Option<Vec<String>>,
pub format: Option<String>,
pub state: Option<String>,
}
#[derive(Deserialize, JsonSchema)]
pub struct DigestArgs {
pub projects: Option<Vec<String>>,
}
#[derive(Deserialize, JsonSchema)]
pub struct MirrorCheckArgs {
pub path: String,
pub projects: Option<Vec<String>>,
}
#[derive(Deserialize, JsonSchema)]
pub struct ClaimArgs {
pub issue_id: String,
pub force: Option<bool>,
}
#[derive(Deserialize, JsonSchema)]
pub struct AppendArgs {
pub issue_id: String,
pub text: String,
}
#[derive(Deserialize, JsonSchema)]
pub struct NoteArgs {
pub issue_id: String,
pub text: String,
}
#[derive(Deserialize, JsonSchema)]
pub struct ClaimsArgs {
pub holder: Option<String>,
pub project: Option<String>,
pub json: Option<bool>,
}
#[derive(Deserialize, JsonSchema)]
pub struct AgendaArgs {
pub days: Option<i64>,
pub project: Option<String>,
}
#[derive(Deserialize, JsonSchema)]
pub struct FoldArgs {
pub file: String,
pub project: String,
}
#[derive(Deserialize, JsonSchema)]
pub struct HygieneArgs {
pub stale_days: Option<i64>,
}
#[derive(Deserialize, JsonSchema)]
pub struct EventsArgs {
pub since: Option<u64>,
pub limit: Option<usize>,
}
#[derive(Deserialize, JsonSchema)]
pub struct PingArgs {
pub detail: Option<String>,
}
#[derive(Deserialize, JsonSchema)]
pub struct DepthArgs {
pub issue_id: String,
pub depth: Option<usize>,
}
#[derive(Deserialize, JsonSchema)]
pub struct RefileArgs {
pub issue_id: String,
pub to: String,
}
#[derive(Deserialize, JsonSchema)]
pub struct RejectArgs {
pub issue_id: String,
pub to: Option<String>,
pub project: Option<String>,
pub title: Option<String>,
pub reason: Option<String>,
}
#[derive(Deserialize, JsonSchema)]
pub struct WaitArgs {
pub last: Option<u64>,
pub id: Option<String>,
pub until_terminal: Option<bool>,
pub poll_ms: Option<u64>,
pub timeout_ms: Option<u64>,
}
pub fn priority_char(raw: Option<&String>) -> Option<char> {
raw.and_then(|s| s.trim().chars().next())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn priority_takes_the_first_character() {
assert_eq!(priority_char(Some(&"A".to_string())), Some('A'));
assert_eq!(priority_char(Some(&" b".to_string())), Some('b'));
assert_eq!(priority_char(Some(&String::new())), None);
assert_eq!(priority_char(None), None);
}
}