import { FromJsonStrategy, SERIALIZABLE_CLASS_MAP, SerializePropertyOptions, ToJsonStrategy,} from "./serializable.ts";
import { SerializePropertyOptionsMap } from "./serialize_property_options_map.ts";
export const ERROR_MESSAGE_SYMBOL_PROPERTY_NAME = "The key name cannot be inferred from a symbol. A value for serializedName must be provided";
export type ToSerializedKeyStrategy = (propertyName: string | symbol) => string;
export type SerializePropertyArgument = | string | ToSerializedKeyStrategy | { serializedKey?: string | ToSerializedKeyStrategy; fromJsonStrategy?: | FromJsonStrategy | (FromJsonStrategy | FromJsonStrategy[])[]; toJsonStrategy?: | ToJsonStrategy | (ToJsonStrategy | ToJsonStrategy[])[]; };
interface SerializePropertyArgumentObject { serializedKey: string; fromJsonStrategy?: | FromJsonStrategy | (FromJsonStrategy | FromJsonStrategy[])[]; toJsonStrategy?: | ToJsonStrategy | (ToJsonStrategy | ToJsonStrategy[])[];}
export function SerializeProperty(): PropertyDecorator;
export function SerializeProperty( decoratorArguments: string,): PropertyDecorator;
export function SerializeProperty( decoratorArguments: SerializePropertyArgument,): PropertyDecorator;
export function SerializeProperty( decoratorArguments: SerializePropertyArgument = {},): PropertyDecorator { return function _SerializeProperty( target: unknown, propertyName: string | symbol, ) { const decoratorArgumentOptions = getDecoratorArgumentOptions( decoratorArguments, target, propertyName, );
let serializablePropertiesMap = SERIALIZABLE_CLASS_MAP.get(target);
if (!serializablePropertiesMap) { const parentMap = SERIALIZABLE_CLASS_MAP.get( Object.getPrototypeOf(target), );
SERIALIZABLE_CLASS_MAP.set( target, new SerializePropertyOptionsMap(parentMap), );
serializablePropertiesMap = SERIALIZABLE_CLASS_MAP.get( target, ); }
serializablePropertiesMap?.set( new SerializePropertyOptions( propertyName, decoratorArgumentOptions.serializedKey, decoratorArgumentOptions.fromJsonStrategy, decoratorArgumentOptions.toJsonStrategy, ), ); };}
function getDecoratorArgumentOptions( decoratorArguments: SerializePropertyArgument, target: unknown, propertyName: string | symbol,): SerializePropertyArgumentObject { if (typeof decoratorArguments === "string") { return { serializedKey: decoratorArguments }; }
if (typeof decoratorArguments === "function") { return { serializedKey: decoratorArguments(propertyName), }; }
if ( !decoratorArguments.serializedKey && typeof propertyName === "symbol" ) { throw new Error(ERROR_MESSAGE_SYMBOL_PROPERTY_NAME); }
if (typeof decoratorArguments.serializedKey === "function") { return { serializedKey: decoratorArguments.serializedKey(propertyName), fromJsonStrategy: decoratorArguments.fromJsonStrategy, toJsonStrategy: decoratorArguments.toJsonStrategy, }; }
return { serializedKey: (target as any).tsTransformKey(propertyName), ...decoratorArguments, };}