/*
 * Copyright 2017, Data61, CSIRO (ABN 41 687 119 230)
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */

#include <camkes/error.h>
#include <stdio.h>
#include <utils/util.h>
#include <inttypes.h>

/* The default error handler that is invoked if no other error handler is
 * registered.
 */
static camkes_error_action_t default_error_handler(camkes_error_t *error)
{
    fprintf(stderr, "-- %s --\n", error->instance);
    switch (error->type) {

    case CE_BUFFER_LENGTH_EXCEEDED:
        fprintf(stderr, "Error: about to exceed buffer length by writing "
                "up to %u bytes\n", error->target_length);
        break;

    case CE_INVALID_METHOD_INDEX:
        fprintf(stderr, "Error: invalid method index of %"PRIu64"\n",
                error->invalid_index);
        break;

    case CE_MALFORMED_RPC_PAYLOAD:
        fprintf(stderr, "Error: Malformed RPC payload\n");
        break;

    case CE_SYSCALL_FAILED:
        fprintf(stderr, "Error: syscall failed\n");
        break;

    case CE_ALLOCATION_FAILURE:
        fprintf(stderr, "Error: allocation failed\n");
        break;

    default:
        UNREACHABLE();
    }
    fprintf(stderr, "Occurred at %s:%lu\n", error->filename, error->lineno);
    fprintf(stderr, "Details: %s\n", error->description);

    return CEA_HALT;
}

/* Currently active error handler. */
static camkes_error_handler_t err = default_error_handler;

camkes_error_action_t camkes_error(camkes_error_t *e)
{
    return err(e);
}

camkes_error_handler_t camkes_register_error_handler(camkes_error_handler_t handler)
{
    camkes_error_handler_t old = err;
    err = handler;
    return old;
}
