xref: /aosp_15_r20/external/emboss/compiler/util/name_conversion.py (revision 99e0aae7469b87d12f0ad23e61142c2d74c1ef70)
1*99e0aae7SDavid Rees# Copyright 2019 Google LLC
2*99e0aae7SDavid Rees#
3*99e0aae7SDavid Rees# Licensed under the Apache License, Version 2.0 (the "License");
4*99e0aae7SDavid Rees# you may not use this file except in compliance with the License.
5*99e0aae7SDavid Rees# You may obtain a copy of the License at
6*99e0aae7SDavid Rees#
7*99e0aae7SDavid Rees#     https://www.apache.org/licenses/LICENSE-2.0
8*99e0aae7SDavid Rees#
9*99e0aae7SDavid Rees# Unless required by applicable law or agreed to in writing, software
10*99e0aae7SDavid Rees# distributed under the License is distributed on an "AS IS" BASIS,
11*99e0aae7SDavid Rees# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*99e0aae7SDavid Rees# See the License for the specific language governing permissions and
13*99e0aae7SDavid Rees# limitations under the License.
14*99e0aae7SDavid Rees
15*99e0aae7SDavid Rees"""Conversions between snake-, camel-, and shouty-case names."""
16*99e0aae7SDavid Rees
17*99e0aae7SDavid Reesfrom enum import Enum
18*99e0aae7SDavid Rees
19*99e0aae7SDavid Rees
20*99e0aae7SDavid Reesclass Case(str, Enum):
21*99e0aae7SDavid Rees  SNAKE = "snake_case"
22*99e0aae7SDavid Rees  SHOUTY = "SHOUTY_CASE"
23*99e0aae7SDavid Rees  CAMEL = "CamelCase"
24*99e0aae7SDavid Rees  K_CAMEL = "kCamelCase"
25*99e0aae7SDavid Rees
26*99e0aae7SDavid Rees
27*99e0aae7SDavid Rees# Map of (from, to) cases to their conversion function. Initially only contains
28*99e0aae7SDavid Rees# identity case conversions, additional conversions are added with the
29*99e0aae7SDavid Rees# _case_conversion decorator.
30*99e0aae7SDavid Rees_case_conversions = {(case.value, case.value): lambda x: x for case in Case}
31*99e0aae7SDavid Rees
32*99e0aae7SDavid Rees
33*99e0aae7SDavid Reesdef _case_conversion(case_from, case_to):
34*99e0aae7SDavid Rees  """Decorator to dynamically dispatch case conversions at runtime."""
35*99e0aae7SDavid Rees  def _func(f):
36*99e0aae7SDavid Rees    _case_conversions[case_from, case_to] = f
37*99e0aae7SDavid Rees    return f
38*99e0aae7SDavid Rees
39*99e0aae7SDavid Rees  return _func
40*99e0aae7SDavid Rees
41*99e0aae7SDavid Rees
42*99e0aae7SDavid Rees@_case_conversion(Case.SNAKE, Case.CAMEL)
43*99e0aae7SDavid Rees@_case_conversion(Case.SHOUTY, Case.CAMEL)
44*99e0aae7SDavid Reesdef snake_to_camel(name):
45*99e0aae7SDavid Rees  """Convert from snake_case to CamelCase. Also works from SHOUTY_CASE."""
46*99e0aae7SDavid Rees  return "".join(word.capitalize() for word in name.split("_"))
47*99e0aae7SDavid Rees
48*99e0aae7SDavid Rees
49*99e0aae7SDavid Rees@_case_conversion(Case.CAMEL, Case.K_CAMEL)
50*99e0aae7SDavid Reesdef camel_to_k_camel(name):
51*99e0aae7SDavid Rees  """Convert from CamelCase to kCamelCase."""
52*99e0aae7SDavid Rees  return "k" + name
53*99e0aae7SDavid Rees
54*99e0aae7SDavid Rees
55*99e0aae7SDavid Rees@_case_conversion(Case.SNAKE, Case.K_CAMEL)
56*99e0aae7SDavid Rees@_case_conversion(Case.SHOUTY, Case.K_CAMEL)
57*99e0aae7SDavid Reesdef snake_to_k_camel(name):
58*99e0aae7SDavid Rees  """Converts from snake_case to kCamelCase. Also works from SHOUTY_CASE."""
59*99e0aae7SDavid Rees  return camel_to_k_camel(snake_to_camel(name))
60*99e0aae7SDavid Rees
61*99e0aae7SDavid Rees
62*99e0aae7SDavid Reesdef convert_case(case_from, case_to, value):
63*99e0aae7SDavid Rees  """Converts cases based on runtime case values.
64*99e0aae7SDavid Rees
65*99e0aae7SDavid Rees  Note: Cases can be strings or enum values."""
66*99e0aae7SDavid Rees  return _case_conversions[case_from, case_to](value)
67*99e0aae7SDavid Rees
68*99e0aae7SDavid Rees
69*99e0aae7SDavid Reesdef is_case_conversion_supported(case_from, case_to):
70*99e0aae7SDavid Rees  """Determines if a case conversion would be supported"""
71*99e0aae7SDavid Rees  return (case_from, case_to) in _case_conversions
72