From 41f152b80ac10de22f330ec240196db484a8a479 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Sat, 27 May 2017 15:05:41 +0200 Subject: simplify Checkable.Class annotation and allow extra fields in /keys response --- src/checkable.ts | 70 +++++++++++++++++--------------------------------------- src/types.ts | 12 +++++----- src/wallet.ts | 14 ++++++------ 3 files changed, 34 insertions(+), 62 deletions(-) (limited to 'src') diff --git a/src/checkable.ts b/src/checkable.ts index 6bfaea013..24eebc713 100644 --- a/src/checkable.ts +++ b/src/checkable.ts @@ -206,55 +206,27 @@ export namespace Checkable { * This annotation adds the implementation of the `checked` * static method. */ - export function Class(target: any) { - target.checked = (v: any) => { - return checkValue(v, { - propertyKey: "(root)", - type: target, - checker: checkValue - }, ["(root)"]); - }; - return target; - } - - /** - * A checker for a class (see [[Class]) that allows - * extra properties to exist on the JSON object being validated. - */ - export function ClassWithExtra(target: any) { - target.checked = (v: any) => { - return checkValue(v, { - propertyKey: "(root)", - type: target, - extraAllowed: true, - checker: checkValue - }, ["(root)"]); - }; - return target; - } - - - /** - * A validator for a class that can have an additional validate - * method. The validate method is a member method of type `() => void` - * that throws an exception on invalidation errors. - */ - export function ClassWithValidator(target: any) { - target.checked = (v: any) => { - let cv = checkValue(v, { - propertyKey: "(root)", - type: target, - checker: checkValue - }, ["(root)"]); - let instance = new target(); - if (typeof instance.validate !== "function") { - throw Error("invalid Checkable annotion: validate method required"); - } - // May throw exception - instance.validate.call(cv); - return cv; - }; - return target; + export function Class(opts: {extra?: boolean, validate?: boolean} = {}) { + return (target: any) => { + target.checked = (v: any) => { + let cv = checkValue(v, { + propertyKey: "(root)", + type: target, + extraAllowed: !!opts.extra, + checker: checkValue + }, ["(root)"]); + if (opts.validate) { + let instance = new target(); + if (typeof instance.validate !== "function") { + throw Error("invalid Checkable annotion: validate method required"); + } + // May throw exception + instance.validate.call(cv); + } + return cv; + }; + return target; + } } diff --git a/src/types.ts b/src/types.ts index 9b8facf78..26280874c 100644 --- a/src/types.ts +++ b/src/types.ts @@ -28,7 +28,7 @@ */ import { Checkable } from "./checkable"; -@Checkable.Class +@Checkable.Class() export class AmountJson { @Checkable.Number value: number; @@ -106,7 +106,7 @@ export interface CurrencyRecord { } -@Checkable.Class +@Checkable.Class() export class CreateReserveResponse { /** * Exchange URL where the bank should create the reserve. @@ -187,7 +187,7 @@ export class DenominationRecord { /** * Denomination as found in the /keys response from the exchange. */ -@Checkable.Class +@Checkable.Class() export class Denomination { @Checkable.Value(AmountJson) value: AmountJson; @@ -304,7 +304,7 @@ export interface PaybackRequest { coin_sig: string; } -@Checkable.Class +@Checkable.Class() export class PaybackConfirmation { /** * public key of the reserve that will receive the payback. @@ -477,7 +477,7 @@ export interface CoinRecord { } -@Checkable.Class +@Checkable.Class() export class ExchangeHandle { @Checkable.String master_pub: string; @@ -524,7 +524,7 @@ interface Merchant { instance?: string; } -@Checkable.ClassWithValidator +@Checkable.Class({validate: true}) export class Contract { validate() { diff --git a/src/wallet.ts b/src/wallet.ts index f2c38078b..f48fcc76e 100644 --- a/src/wallet.ts +++ b/src/wallet.ts @@ -89,7 +89,7 @@ export interface CoinWithDenom { * Element of the payback list that the * exchange gives us in /keys. */ -@Checkable.Class +@Checkable.Class() export class Payback { @Checkable.String h_denom_pub: string; @@ -99,7 +99,7 @@ export class Payback { /** * Structure that the exchange gives us in /keys. */ -@Checkable.Class +@Checkable.Class({extra: true}) export class KeysJson { @Checkable.List(Checkable.Value(Denomination)) denoms: Denomination[]; @@ -129,7 +129,7 @@ export class KeysJson { } -@Checkable.Class +@Checkable.Class() class WireFeesJson { @Checkable.Value(AmountJson) wire_fee: AmountJson; @@ -150,7 +150,7 @@ class WireFeesJson { } -@Checkable.ClassWithExtra +@Checkable.Class({extra: true}) class WireDetailJson { @Checkable.String type: string; @@ -162,7 +162,7 @@ class WireDetailJson { } -@Checkable.Class +@Checkable.Class() export class CreateReserveRequest { /** * The initial amount for the reserve. @@ -180,7 +180,7 @@ export class CreateReserveRequest { } -@Checkable.Class +@Checkable.Class() export class ConfirmReserveRequest { /** * Public key of then reserve that should be marked @@ -193,7 +193,7 @@ export class ConfirmReserveRequest { } -@Checkable.Class +@Checkable.Class() export class OfferRecord { @Checkable.Value(Contract) contract: Contract; -- cgit v1.2.3