Call flow with explicit ownership

#include "saikuro.h"

int main(void) {
    saikuro_client_t *client = saikuro_client_connect("tcp://127.0.0.1:7700");
    if (!client) {
        char *err = saikuro_last_error_message();
        fprintf(stderr, "connect failed: %s\n", err ? err : "unknown");
        saikuro_string_free(err);
        return 1;
    }

    const char *args_json = "[10, 32]";
    char *result_json = saikuro_client_call_json(client, "math.add", args_json);
    if (!result_json) {
        char *err = saikuro_last_error_message();
        fprintf(stderr, "call failed: %s\n", err ? err : "unknown");
        saikuro_string_free(err);
        saikuro_client_free(client);
        return 1;
    }

    printf("result: %s\n", result_json);
    saikuro_string_free(result_json); /* free API-returned strings */
    saikuro_client_free(client);
    return 0;
}

Provider callback ownership contract

Provider callbacks return ownership of a heap string to the adapter.

static char *add_cb(void *ctx, const char *args_json) {
    (void)ctx;
    (void)args_json;
    return saikuro_string_dup("42"); /* required ownership-safe return */
}

Never return stack memory or string literals from provider callbacks.

Next Steps