xref: /aosp_15_r20/external/toolchain-utils/crosperf/field.py (revision 760c253c1ed00ce9abd48f8546f08516e57485fe)
1# -*- coding: utf-8 -*-
2# Copyright 2011 The ChromiumOS Authors
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6"""Module to represent a Field in an experiment file."""
7
8
9class Field(object):
10    """Class representing a Field in an experiment file."""
11
12    def __init__(self, name, required, default, inheritable, description):
13        self.name = name
14        self.required = required
15        self.assigned = False
16        self.default = default
17        self._value = default
18        self.inheritable = inheritable
19        self.description = description
20
21    def Set(self, value, parse=True):
22        if parse:
23            self._value = self._Parse(value)
24        else:
25            self._value = value
26        self.assigned = True
27
28    def Append(self, value):
29        self._value += self._Parse(value)
30        self.assigned = True
31
32    def _Parse(self, value):
33        return value
34
35    def Get(self):
36        return self._value
37
38    def GetString(self):
39        return str(self._value)
40
41
42class TextField(Field):
43    """Class of text field."""
44
45    def __init__(
46        self,
47        name,
48        required=False,
49        default="",
50        inheritable=False,
51        description="",
52    ):
53        super(TextField, self).__init__(
54            name, required, default, inheritable, description
55        )
56
57    def _Parse(self, value):
58        return str(value)
59
60
61class BooleanField(Field):
62    """Class of boolean field."""
63
64    def __init__(
65        self,
66        name,
67        required=False,
68        default=False,
69        inheritable=False,
70        description="",
71    ):
72        super(BooleanField, self).__init__(
73            name, required, default, inheritable, description
74        )
75
76    def _Parse(self, value):
77        if value.lower() == "true":
78            return True
79        elif value.lower() == "false":
80            return False
81        raise TypeError(
82            "Invalid value for '%s'. Must be true or false." % self.name
83        )
84
85
86class IntegerField(Field):
87    """Class of integer field."""
88
89    def __init__(
90        self, name, required=False, default=0, inheritable=False, description=""
91    ):
92        super(IntegerField, self).__init__(
93            name, required, default, inheritable, description
94        )
95
96    def _Parse(self, value):
97        return int(value)
98
99
100class FloatField(Field):
101    """Class of float field."""
102
103    def __init__(
104        self, name, required=False, default=0, inheritable=False, description=""
105    ):
106        super(FloatField, self).__init__(
107            name, required, default, inheritable, description
108        )
109
110    def _Parse(self, value):
111        return float(value)
112
113
114class ListField(Field):
115    """Class of list field."""
116
117    def __init__(
118        self,
119        name,
120        required=False,
121        default=None,
122        inheritable=False,
123        description="",
124    ):
125        super(ListField, self).__init__(
126            name, required, default, inheritable, description
127        )
128
129    def _Parse(self, value):
130        return value.split()
131
132    def GetString(self):
133        return " ".join(self._value)
134
135    def Append(self, value):
136        v = self._Parse(value)
137        if not self._value:
138            self._value = v
139        else:
140            self._value += v
141        self.assigned = True
142
143
144class EnumField(Field):
145    """Class of enum field."""
146
147    def __init__(
148        self,
149        name,
150        options,
151        required=False,
152        default="",
153        inheritable=False,
154        description="",
155    ):
156        super(EnumField, self).__init__(
157            name, required, default, inheritable, description
158        )
159        self.options = options
160
161    def _Parse(self, value):
162        if value not in self.options:
163            raise TypeError(
164                "Invalid enum value for field '%s'. Must be one of (%s)"
165                % (self.name, ", ".join(self.options))
166            )
167        return str(value)
168