simplify Checkable.Class annotation and allow extra fields in /keys response
This commit is contained in:
parent
f9e1ad0624
commit
41f152b80a
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
12
src/types.ts
12
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() {
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user