"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.serde = serde;
const option_1 = require("./option");
const ContextKind = Object.freeze({
    Class: 'class',
    Method: 'method',
    Getter: 'getter',
    Setter: 'setter',
    Field: 'field',
    Accessor: 'accessor'
});
function decorateClass(target, context, options) {
    const serde = context.metadata.serde;
    context.metadata.serde = new option_1.SerdeOptions(target, options, serde === null || serde === void 0 ? void 0 : serde.properties);
}
function decorateField(context, options) {
    const serde = context.metadata.serde || new option_1.SerdeOptions(undefined);
    serde.properties.set(context.name, options);
    context.metadata.serde = serde;
}
function serde(options) {
    return function (target, context) {
        switch (context.kind) {
            case ContextKind.Class:
                decorateClass(target, context, options);
                break;
            case ContextKind.Field:
                decorateField(context, options);
            default:
                break;
        }
    };
}