zammad-api 0.4.0

Async, idiomatic Rust client for the Zammad Service Platform
Documentation
//! List every Knowledge Base (FAQ) answer from a Zammad instance, then read
//! the first one in full (including its body).
//!
//! ```sh
//! ZAMMAD_URL=https://help.example.com ZAMMAD_TOKEN=... \
//!   cargo run --example knowledge_base_list
//! ```

use zammad_api::{Auth, Client};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let url = std::env::var("ZAMMAD_URL")?;
    let token = std::env::var("ZAMMAD_TOKEN")?;

    let client = Client::builder().url(url).auth(Auth::token(token)).build()?;
    let kb = client.knowledge_base();

    let answers = kb.list().await?;
    for answer in &answers {
        println!(
            "#{:>6}  [{:<7}]  {}  ({})",
            answer.id,
            if answer.published { "public" } else { "draft" },
            answer.title.as_deref().unwrap_or("-"),
            answer.category.as_deref().unwrap_or("-")
        );
    }
    eprintln!("listed {} answers", answers.len());

    let Some(first) = answers.first() else {
        eprintln!("no knowledge base answers found");
        return Ok(());
    };

    let answer = kb.get(first.id).await?;
    println!(
        "\n=== first answer #{:>4}  [{:<7}]  {}  ({}) ===",
        answer.id,
        if answer.published { "public" } else { "draft" },
        answer.title.as_deref().unwrap_or("-"),
        answer.category.as_deref().unwrap_or("-")
    );
    println!("{}", answer.body.as_deref().unwrap_or("(no body)"));
    Ok(())
}