mockbox 0.10.0

A Rust-based HTTP mock server with scripting capabilities using Rune.
// Storage API Example
//
// This script only compiles if the "storage" feature is enabled in Cargo.toml.

pub fn handle_request(request) {
    // Get request details
    let method = request.method;
    let path = request.path;
    let query = request.query;
    let body = request.body;

    match path.parts() {
        // Example: Store a value (POST /storage/set?key=mykey with body as value)
        ["storage", "set"] if method == "POST" => {
            let key = query.get("key")?;
            storage::set(key, body)?;
            #{ success: true, message: `Stored value for key: ${key}` }
        },

        // Example: Get a value (GET /storage/get?key=mykey)
        ["storage", "get"] if method == "GET" => {
            let key = query.get("key")?;
            let value = storage::get(key)?;
            match value {
                Some(v) => #{ key, value: v },
                None => (404, `Key not found: ${key}`),
            }
        },

        // Example: Delete a value (DELETE /storage/delete?key=mykey)
        ["storage", "delete"] if method == "DELETE" => {
            let key = query.get("key")?;
            let deleted = storage::delete(key)?;
            if deleted {
                #{ success: true, message: `Deleted key: ${key}` }
            } else {
                (404, `Key not found: ${key}`)
            }
        },

        // Example: Check if key exists (GET /storage/has?key=mykey)
        ["storage", "has"] if method == "GET" => {
            let key = query.get("key")?;
            let exists = storage::has(key)?;
            #{ key, exists }
        },

        // Example: List all keys (GET /storage/keys)
        ["storage", "keys"] if method == "GET" => {
            let keys = storage::keys()?;
            #{ keys, count: keys.len() }
        },

        // Example: Clear all storage (DELETE /storage/clear)
        ["storage", "clear"] if method == "DELETE" => {
            storage::clear()?;
            #{ success: true, message: "All storage cleared" }
        },

        // Example: Counter endpoint using storage
        ["counter"] if method == "GET" => {
            let count = match storage::get("counter")? {
                Some(v) => v.parse::<i64>().unwrap_or(0),
                None => 0,
            };
            #{ counter: count }
        },

        ["counter"] if method == "POST" => {
            let count = match storage::get("counter")? {
                Some(v) => v.parse::<i64>().unwrap_or(0),
                None => 0,
            };
            let new_count = count + 1;
            storage::set("counter", `${new_count}`)?;
            #{ counter: new_count }
        },

        // Example: Simple visitor tracking
        ["visit"] => {
            let visits = match storage::get("visits")? {
                Some(v) => v.parse::<i64>().unwrap_or(0),
                None => 0,
            };
            let new_visits = visits + 1;
            storage::set("visits", `${new_visits}`)?;
            `Welcome! You are visitor #${new_visits}`
        }
    }
}