zammad-api 0.2.0

Async, idiomatic Rust client for the Zammad REST API
Documentation
// Verifies the Knowledge Base write path against a live instance.
// Needs a token with Knowledge Base *editor* permission.
//
//   ZAMMAD_URL=... ZAMMAD_API_TOKEN=... KB_CATEGORY_ID=6 \
//     cargo run --example kb_write_smoke
//
// Creates a draft, updates it, publishes, then unpublishes — printing the
// answer id so the caller can delete it afterwards.
use zammad_api::api::{KbAnswerPatch, NewKbAnswer};
use zammad_api::{Auth, Client};

#[tokio::main]
async fn main() -> zammad_api::Result<()> {
    let url = std::env::var("ZAMMAD_URL").unwrap();
    let token = std::env::var("ZAMMAD_API_TOKEN").unwrap();
    let category_id: u64 = std::env::var("KB_CATEGORY_ID").unwrap().parse().unwrap();
    let z = Client::builder().url(url).auth(Auth::bearer(token)).build()?;
    let kb = z.knowledge_base();

    println!("=== create draft ===");
    let created = kb
        .create_answer(NewKbAnswer {
            category_id,
            title: "__mcp_write_smoke".into(),
            body: "<p>original body</p>".into(),
            published: false,
        })
        .await?;
    let id = created.id;
    println!("  id={id} published={} title={:?}", created.published, created.title);
    println!("  body={:?}", created.body);

    println!("=== update title+body ===");
    let updated = kb
        .update_answer(
            id,
            KbAnswerPatch {
                title: Some("__mcp_write_smoke (edited)".into()),
                body: Some("<p>edited body</p>".into()),
                published: None,
            },
        )
        .await?;
    println!("  title={:?} body={:?}", updated.title, updated.body);

    println!("=== publish ===");
    let pubd = kb
        .update_answer(id, KbAnswerPatch { published: Some(true), ..Default::default() })
        .await?;
    println!("  published={}", pubd.published);

    println!("=== unpublish ===");
    let unpubd = kb
        .update_answer(id, KbAnswerPatch { published: Some(false), ..Default::default() })
        .await?;
    println!("  published={}", unpubd.published);

    println!("CLEANUP_ANSWER_ID={id}");
    Ok(())
}