teamtalk 6.0.0

TeamTalk SDK for Rust
Documentation
#![cfg(feature = "bot")]

use teamtalk::{Args, CommandPattern, MemoryStateStore, StateStore, parse_command};

#[test]
fn parse_command_splits_name_and_args() {
    let cmd = parse_command("/help ping pong", &['/', '!']).expect("expected command");
    assert_eq!(cmd.prefix, '/');
    assert_eq!(cmd.name, "help");
    assert_eq!(cmd.arg(0), Some("ping"));
    assert_eq!(cmd.arg(1), Some("pong"));
}

#[test]
fn parse_command_rejects_non_prefixed_input() {
    assert!(parse_command("help", &['/']).is_none());
}

#[test]
fn args_helpers_parse_and_rest() {
    let raw = vec!["10".to_owned(), "hello".to_owned(), "world".to_owned()];
    let args = Args::new(&raw);
    assert_eq!(args.get::<i32>(0).expect("parse int"), Some(10));
    assert!(args.get::<bool>(1).is_err());
    assert_eq!(args.rest(1).as_deref(), Some("hello world"));
}

#[test]
fn args_require_returns_error_for_missing_value() {
    let raw = vec!["5".to_owned()];
    let args = Args::new(&raw);
    assert!(args.require::<i32>(1, "/set <value>").is_err());
}

#[test]
fn memory_store_roundtrip() {
    let mut store = MemoryStateStore::new();
    store.set("dialog:user:10".to_owned(), "awaiting_code".to_owned());
    assert_eq!(
        store.get("dialog:user:10").as_deref(),
        Some("awaiting_code")
    );
    assert_eq!(
        store.remove("dialog:user:10").as_deref(),
        Some("awaiting_code")
    );
    assert!(store.get("dialog:user:10").is_none());
}

#[test]
fn command_pattern_usage_and_bounds() {
    let pattern = CommandPattern::parse("ban <user> [reason...]").expect("pattern");
    assert_eq!(pattern.command(), "ban");
    assert_eq!(pattern.usage(), "ban <user> [reason...]");
    assert_eq!(pattern.usage_with_prefix('/'), "/ban <user> [reason...]");
    assert_eq!(pattern.min_args(), 1);
    assert_eq!(pattern.max_args(), None);
}