aboutsummaryrefslogtreecommitdiffstats
path: root/netmodel/model/type.py
diff options
context:
space:
mode:
Diffstat (limited to 'netmodel/model/type.py')
-rw-r--r--netmodel/model/type.py89
1 files changed, 89 insertions, 0 deletions
diff --git a/netmodel/model/type.py b/netmodel/model/type.py
new file mode 100644
index 00000000..20dc2580
--- /dev/null
+++ b/netmodel/model/type.py
@@ -0,0 +1,89 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2017 Cisco and/or its affiliates.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at:
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+from netmodel.util.meta import inheritors
+
+class BaseType:
+ @staticmethod
+ def name():
+ return self.__class__.__name__.lower()
+
+class String(BaseType):
+ def __init__(self, *args, **kwargs):
+ self._min_size = kwargs.pop('min_size', None)
+ self._max_size = kwargs.pop('max_size', None)
+ self._ascii = kwargs.pop('ascii', False)
+ self._forbidden = kwargs.pop('forbidden', None)
+ super().__init__()
+
+class Integer(BaseType):
+ def __init__(self, *args, **kwargs):
+ self._min_value = kwargs.pop('min_value', None)
+ self._max_value = kwargs.pop('max_value', None)
+ super().__init__()
+
+class Double(BaseType):
+ def __init__(self, *args, **kwargs):
+ self._min_value = kwargs.pop('min_value', None)
+ self._max_value = kwargs.pop('max_value', None)
+ super().__init__()
+
+class Bool(BaseType):
+ pass
+
+class Dict(BaseType):
+ pass
+
+class Self(BaseType):
+ """Self-reference
+ """
+
+class Type:
+ BASE_TYPES = (String, Integer, Double, Bool)
+ _registry = dict()
+
+ @staticmethod
+ def from_string(type_name, raise_exception=True):
+ """Returns a type corresponding to the type name.
+
+ Params:
+ type_name (str) : Name of the type
+
+ Returns
+ Type : Type class of the requested type name
+ """
+ type_cls = [t for t in Type.BASE_TYPES if t.name == type_name]
+ if type_cls:
+ return type_cls[0]
+
+ type_cls = Type._registry.get(type_name, None)
+ if not type_cls:
+ raise Exception("No type found: {}".format(type_name))
+ return type_cls
+
+ @staticmethod
+ def is_base_type(type_cls):
+ return type_cls in Type.BASE_TYPES
+
+ @staticmethod
+ def exists(typ):
+ return (isinstance(typ, type) and typ in inheritors(BaseType)) \
+ or isinstance(typ, BaseType)
+
+is_base_type = Type.is_base_type
+is_type = Type.exists