Source code
Revision control
Copy as Markdown
Other Tools
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
import yaml
def main(output, annotations_path):
with open(annotations_path) as annotations_file:
annotations = yaml.safe_load(annotations_file)
names = []
for name, data in annotations:
glean = data.get("glean")
if glean is None:
continue
annotation_type = data["type"]
glean_type = glean["type"]
namespace, _, metric = glean["metric"].rpartition(".")
namespace = namespace.replace(".", "_")
# Treat all numbers the same way
if annotation_type in ["usize", "u64", "u32"]:
annotation_type = "u64"
conversion = None
unique_conversion = f"convert_to_{namespace}_{metric}"
custom_convert = glean.get("custom_convert")
if custom_convert:
if custom_convert is True:
conversion = unique_conversion
else:
conversion = f"convert_{custom_convert}"
if conversion is None:
# Only use a standard conversion when there is no ambiguity
is_standard = (annotation_type, glean_type) in [
("boolean", "boolean"),
("string", "string"),
("u64", "quantity"),
("string", "string_list"),
]
if is_standard:
conversion = f"convert_{annotation_type}_to_{glean_type}"
else:
conversion = unique_conversion
args = ""
if glean_type == "string_list":
args += f", \"{glean['delimiter']}\""
output.write(
f'#[allow(non_upper_case_globals)] pub const {name}: Annotation = convert!({namespace}::{metric} = {conversion}("{name}"{args}));\n'
)
names.append(name)
names = ",".join(names)
output.write(f"pub const ANNOTATIONS: &[Annotation] = &[{names}];\n")