* the License.
* ============LICENSE_END==========================================================================
*/
-export interface AccessFlags {
- "read": boolean,
- "write": boolean,
- "create": boolean
-}
-export interface ViewElementBase {
+export type ViewElementBase = {
"id": string;
"label": string;
- "viewId": string;
- "leafrefPath": string;
- "accessFlags": AccessFlags;
- "description": string;
+ "module": string;
+ "path": string;
+ "config": boolean;
+ "ifFeature"?: string;
+ "when"?: string;
+ "mandatory"?: boolean;
+ "description"?: string;
+ "isList"?: boolean;
+ "default"?: string;
+ "status"?: "current" | "deprecated" | "obsolete",
+ "reference"?: string, // https://tools.ietf.org/html/rfc7950#section-7.21.4
+}
+
+// https://tools.ietf.org/html/rfc7950#section-9.8
+export type ViewElementBinary = ViewElementBase & {
+ "uiType": "binary";
+ "length"?: Expression<YangRange>; // number of octets
}
-export interface ViewElementString extends ViewElementBase {
+// https://tools.ietf.org/html/rfc7950#section-9.7.4
+export type ViewElementBits = ViewElementBase & {
+ "uiType": "bits";
+ "flags": {
+ [name: string]: number | undefined; // 0 - 4294967295
+ }
+}
+
+// https://tools.ietf.org/html/rfc7950#section-9
+export type ViewElementString = ViewElementBase & {
"uiType": "string";
+ "pattern"?: Expression<RegExp>;
+ "length"?: Expression<YangRange>;
+ "invertMatch"?: true;
+}
+
+// special case derived from
+export type ViewElementDate = ViewElementBase & {
+ "uiType": "date";
+ "pattern"?: Expression<RegExp>;
+ "length"?: Expression<YangRange>;
+ "invertMatch"?: true;
}
-export interface ViewElementNumber extends ViewElementBase {
+// https://tools.ietf.org/html/rfc7950#section-9.3
+export type ViewElementNumber = ViewElementBase & {
"uiType": "number";
- "min"?: number;
- "max"?: number;
- "unit"?: string;
+ "min": number;
+ "max": number;
+ "range"?: Expression<YangRange>;
+ "units"?: string;
"format"?: string;
+ "fDigits"?: number;
}
-export interface ViewElementBoolean extends ViewElementBase {
+// https://tools.ietf.org/html/rfc7950#section-9.5
+export type ViewElementBoolean = ViewElementBase & {
"uiType": "boolean";
"trueValue"?: string;
"falseValue"?: string;
}
-export interface ViewElementObject extends ViewElementBase {
+// https://tools.ietf.org/html/rfc7950#section-9.6.4
+export type ViewElementSelection = ViewElementBase & {
+ "uiType": "selection";
+ "multiSelect"?: boolean
+ "options": {
+ "key": string;
+ "value": string;
+ "description"?: string,
+ "status"?: "current" | "deprecated" | "obsolete",
+ "reference"?: string,
+ }[];
+}
+
+// is a list if isList is true ;-)
+export type ViewElementObject = ViewElementBase & {
"uiType": "object";
+ "isList"?: false;
"viewId": string;
}
-export interface ViewElementSelection extends ViewElementBase {
- "uiType": "selection";
- "multiSelect"?: boolean
- "options": {
- "key": string,
- "value": string,
- "description": string
- }[],
+// Hint: read only lists do not need a key
+export type ViewElementList = (ViewElementBase & {
+ "uiType": "object";
+ "isList": true;
+ "viewId": string;
+ "key"?: string;
+});
+
+export type ViewElementReference = ViewElementBase & {
+ "uiType": "reference";
+ "referencePath": string;
+ "ref": (currentPath: string) => [ViewElement , string] | undefined;
}
-export interface ViewElementList extends ViewElementBase {
- "uiType": "list",
- "listType": "object" | "string" | "number",
- "viewId": string,
+export type ViewElementUnion = ViewElementBase & {
+ "uiType": "union";
+ "elements": ViewElement[];
+}
+
+export type ViewElementChoiseCase = { id: string, label: string, description?: string, elements: { [name: string]: ViewElement } };
+
+export type ViewElementChoise = ViewElementBase & {
+ "uiType": "choise";
+ "cases": {
+ [name: string]: ViewElementChoiseCase;
+ }
+}
+
+// https://tools.ietf.org/html/rfc7950#section-7.14.1
+export type ViewElementRpc = ViewElementBase & {
+ "uiType": "rpc";
+ "inputViewId"?: string;
+ "outputViewId"?: string;
+}
+
+export type ViewElementEmpty = ViewElementBase & {
+ "uiType": "empty";
}
export type ViewElement =
+ | ViewElementEmpty
+ | ViewElementBits
+ | ViewElementBinary
| ViewElementString
+ | ViewElementDate
| ViewElementNumber
| ViewElementBoolean
| ViewElementObject
+ | ViewElementList
| ViewElementSelection
- | ViewElementList;
+ | ViewElementReference
+ | ViewElementUnion
+ | ViewElementChoise
+ | ViewElementRpc;
+
+export const isViewElementString = (viewElement: ViewElement): viewElement is ViewElementString => {
+ return viewElement && (viewElement.uiType === "string" || viewElement.uiType === "date");
+}
+
+export const isViewElementDate = (viewElement: ViewElement): viewElement is ViewElementDate => {
+ return viewElement && (viewElement.uiType === "date");
+}
+
+export const isViewElementNumber = (viewElement: ViewElement): viewElement is ViewElementNumber => {
+ return viewElement && viewElement.uiType === "number";
+}
+
+export const isViewElementBoolean = (viewElement: ViewElement): viewElement is ViewElementBoolean => {
+ return viewElement && viewElement.uiType === "boolean";
+}
+
+export const isViewElementObject = (viewElement: ViewElement): viewElement is ViewElementObject => {
+ return viewElement && viewElement.uiType === "object" && viewElement.isList === false;
+}
+
+export const isViewElementList = (viewElement: ViewElement): viewElement is ViewElementList => {
+ return viewElement && viewElement.uiType === "object" && viewElement.isList === true;
+}
+
+export const isViewElementObjectOrList = (viewElement: ViewElement): viewElement is ViewElementObject | ViewElementList => {
+ return viewElement && viewElement.uiType === "object";
+}
+
+export const isViewElementSelection = (viewElement: ViewElement): viewElement is ViewElementSelection => {
+ return viewElement && viewElement.uiType === "selection";
+}
+
+export const isViewElementReference = (viewElement: ViewElement): viewElement is ViewElementReference => {
+ return viewElement && viewElement.uiType === "reference";
+}
-export interface ViewSpecification {
+export const isViewElementUnion = (viewElement: ViewElement): viewElement is ViewElementUnion => {
+ return viewElement && viewElement.uiType === "union";
+}
+
+export const isViewElementChoise = (viewElement: ViewElement): viewElement is ViewElementChoise => {
+ return viewElement && viewElement.uiType === "choise";
+}
+
+export const isViewElementRpc = (viewElement: ViewElement): viewElement is ViewElementRpc => {
+ return viewElement && viewElement.uiType === "rpc";
+}
+
+export const isViewElementEmpty = (viewElement: ViewElement): viewElement is ViewElementRpc => {
+ return viewElement && viewElement.uiType === "empty";
+}
+
+export const ResolveFunction = Symbol("IsResolved");
+
+export type ViewSpecification = {
"id": string;
- "parentView": string;
- "name": string;
- "language": string;
+ "ns"?: string;
+ "name"?: string;
"title"?: string;
- "url": string;
- "dataPath": string;
- "elements": ViewElement[];
+ "parentView"?: string;
+ "language": string;
+ "ifFeature"?: string;
+ "when"?: string;
+ "uses"?: (string[]) & { [ResolveFunction]?: (parent: string) => void };
+ "elements": { [name: string]: ViewElement };
+ "config": boolean;
+ readonly "canEdit": boolean;
}
+export type YangRange = {
+ min: number,
+ max: number,
+}
+
+export type Expression<T> =
+ | T
+ | Operator<T>;
+
+export type Operator<T> = {
+ operation: "AND" | "OR";
+ arguments: Expression<T>[];
+}
\ No newline at end of file