2 * ============LICENSE_START========================================================================
3 * ONAP : ccsdk feature sdnr wt odlux
4 * =================================================================================================
5 * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
6 * =================================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
8 * in compliance with the License. You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software distributed under the License
13 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
14 * or implied. See the License for the specific language governing permissions and limitations under
16 * ============LICENSE_END==========================================================================
19 import type { WhenAST } from '../yang/whenParser';
21 export type ViewElementBase = {
29 'mandatory'?: boolean;
30 'description'?: string;
33 'status'?: 'current' | 'deprecated' | 'obsolete';
34 'reference'?: string; // https://tools.ietf.org/html/rfc7950#section-7.21.4
37 // https://tools.ietf.org/html/rfc7950#section-9.8
38 export type ViewElementBinary = ViewElementBase & {
40 'length'?: Expression<YangRange>; // number of octets
43 // https://tools.ietf.org/html/rfc7950#section-9.7.4
44 export type ViewElementBits = ViewElementBase & {
47 [name: string]: number | undefined; // 0 - 4294967295
51 // https://tools.ietf.org/html/rfc7950#section-9
52 export type ViewElementString = ViewElementBase & {
54 'pattern'?: Expression<RegExp>;
55 'length'?: Expression<YangRange>;
59 // special case derived from
60 export type ViewElementDate = ViewElementBase & {
62 'pattern'?: Expression<RegExp>;
63 'length'?: Expression<YangRange>;
67 // https://tools.ietf.org/html/rfc7950#section-9.3
68 export type ViewElementNumber = ViewElementBase & {
72 'range'?: Expression<YangRange>;
78 // https://tools.ietf.org/html/rfc7950#section-9.5
79 export type ViewElementBoolean = ViewElementBase & {
82 'falseValue'?: string;
85 // https://tools.ietf.org/html/rfc7950#section-9.6.4
86 export type ViewElementSelection = ViewElementBase & {
87 'uiType': 'selection';
88 'multiSelect'?: boolean;
92 'description'?: string;
93 'status'?: 'current' | 'deprecated' | 'obsolete';
98 // is a list if isList is true ;-)
99 export type ViewElementObject = ViewElementBase & {
105 // Hint: read only lists do not need a key
106 export type ViewElementList = (ViewElementBase & {
113 export type ViewElementReference = ViewElementBase & {
114 'uiType': 'reference';
115 'referencePath': string;
116 'ref': (currentPath: string) => [ViewElement, string] | undefined;
119 export type ViewElementUnion = ViewElementBase & {
121 'elements': ViewElement[];
124 export type ViewElementChoiceCase = { id: string; label: string; description?: string; elements: { [name: string]: ViewElement } };
126 export type ViewElementChoice = ViewElementBase & {
129 [name: string]: ViewElementChoiceCase;
133 // https://tools.ietf.org/html/rfc7950#section-7.14.1
134 export type ViewElementRpc = ViewElementBase & {
136 'inputViewId'?: string;
137 'outputViewId'?: string;
140 export type ViewElementEmpty = ViewElementBase & {
144 export type ViewElement =
154 | ViewElementSelection
155 | ViewElementReference
160 export const isViewElementString = (viewElement: ViewElement): viewElement is ViewElementString => {
161 return viewElement && (viewElement.uiType === 'string' || viewElement.uiType === 'date');
164 export const isViewElementDate = (viewElement: ViewElement): viewElement is ViewElementDate => {
165 return viewElement && (viewElement.uiType === 'date');
168 export const isViewElementNumber = (viewElement: ViewElement): viewElement is ViewElementNumber => {
169 return viewElement && viewElement.uiType === 'number';
172 export const isViewElementBoolean = (viewElement: ViewElement): viewElement is ViewElementBoolean => {
173 return viewElement && viewElement.uiType === 'boolean';
176 export const isViewElementObject = (viewElement: ViewElement): viewElement is ViewElementObject => {
177 return viewElement && viewElement.uiType === 'object' && !viewElement.isList;
180 export const isViewElementList = (viewElement: ViewElement): viewElement is ViewElementList => {
181 return viewElement && viewElement.uiType === 'object' && !!viewElement.isList;
184 export const isViewElementObjectOrList = (viewElement: ViewElement): viewElement is ViewElementObject | ViewElementList => {
185 return viewElement && viewElement.uiType === 'object';
188 export const isViewElementSelection = (viewElement: ViewElement): viewElement is ViewElementSelection => {
189 return viewElement && viewElement.uiType === 'selection';
192 export const isViewElementReference = (viewElement: ViewElement): viewElement is ViewElementReference => {
193 return viewElement && viewElement.uiType === 'reference';
196 export const isViewElementUnion = (viewElement: ViewElement): viewElement is ViewElementUnion => {
197 return viewElement && viewElement.uiType === 'union';
200 export const isViewElementChoice = (viewElement: ViewElement): viewElement is ViewElementChoice => {
201 return viewElement && viewElement.uiType === 'choice';
204 export const isViewElementRpc = (viewElement: ViewElement): viewElement is ViewElementRpc => {
205 return viewElement && viewElement.uiType === 'rpc';
208 export const isViewElementEmpty = (viewElement: ViewElement): viewElement is ViewElementRpc => {
209 return viewElement && viewElement.uiType === 'empty';
212 export const ResolveFunction = Symbol('IsResolved');
214 export type ViewSpecification = {
223 uses?: (string[]) & { [ResolveFunction]?: (parent: string) => void };
224 elements: { [name: string]: ViewElement };
226 readonly canEdit: boolean;
229 export type YangRange = {
234 export type Expression<T> =
238 export type Operator<T> = {
239 operation: 'AND' | 'OR';
240 arguments: Expression<T>[];