aboutsummaryrefslogtreecommitdiffstats
path: root/netmodel/model/type.py
blob: 20dc25807c80084407b4ecd8372ec025dd06e55e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
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