use crate::core::{Project, Status, commit_to_branch};
use crate::error::Result;
use crate::storage::db::load_issue_from_data_branch;
use crate::storage::markdown::format_issue;
pub struct ClaimArgs {
pub id: u32,
pub assignee: String,
pub session: Option<String>,
}
pub fn run(args: ClaimArgs) -> Result<()> {
let project = Project::discover()?;
let mut db = project.open_db()?;
let data_branch = project
.config
.data_branch
.as_deref()
.unwrap_or("data/itack");
let mut issue_info = load_issue_from_data_branch(&project.repo_root, data_branch, args.id)?;
db.claim(args.id, &args.assignee)?;
issue_info.issue.assignee = Some(args.assignee.clone());
issue_info.issue.branch = project.current_branch();
issue_info.issue.session = args.session.clone();
if issue_info.issue.status == Status::Open {
issue_info.issue.status = Status::InProgress;
}
let content = format_issue(&issue_info.issue, &issue_info.title, &issue_info.body)?;
let message = format!("Claim issue #{} for {}", args.id, args.assignee);
commit_to_branch(
&project.repo_root,
data_branch,
&issue_info.relative_path,
content.as_bytes(),
&message,
)?;
println!("Claimed issue #{} for {}", args.id, args.assignee);
Ok(())
}