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