static napi_status s_argument_parse()

in source/class_binder.c [36:110]


static napi_status s_argument_parse(
    napi_env env,
    napi_value value,
    napi_valuetype expected_type,
    bool accept_undefined,
    struct aws_napi_argument *out_value) {

    out_value->node = value;
    AWS_NAPI_CALL(env, napi_typeof(env, value, &out_value->type), { return status; });

    if (expected_type != napi_undefined && out_value->type != expected_type &&
        !(accept_undefined && out_value->type == napi_undefined)) {
        switch (expected_type) {
            case napi_string:
                napi_throw_type_error(env, NULL, "Class binder argument expected a string");
                return napi_string_expected;

            case napi_number:
                napi_throw_type_error(env, NULL, "Class binder argument expected a number");
                return napi_number_expected;

            default:
                napi_throw_type_error(env, NULL, "Class binder argument wrong type");
                return napi_generic_failure;
        }
    }

    switch (out_value->type) {
        case napi_boolean: {
            AWS_NAPI_CALL(env, napi_get_value_bool(env, value, &out_value->native.boolean), { return status; });

            break;
        }

        case napi_string: {
            AWS_NAPI_CALL(env, aws_byte_buf_init_from_napi(&out_value->native.string, env, value), { return status; });

            break;
        }

        case napi_number: {
            AWS_NAPI_CALL(env, napi_get_value_int64(env, value, &out_value->native.number), {
                napi_throw_type_error(env, NULL, "Class binder argument expected a number");
                return status;
            });

            break;
        }

        case napi_external: {
            AWS_NAPI_CALL(env, napi_get_value_external(env, value, &out_value->native.external), {
                napi_throw_type_error(env, NULL, "Class binder argument expected an external");
                return status;
            });

            break;
        }

        case napi_object: {
            /* Attempt to unwrap the object, just in case */
            napi_status result = napi_unwrap(env, value, &out_value->native.external);
            if (result != napi_ok) {
                out_value->native.external = NULL;
            }

            break;
        }

        default:
            /* Don't process, just leave as node value */
            break;
    }

    return napi_ok;
}