1import re
2import string
3
4from .namedelement import NamedElement
5
6""" Class for parsing 'service_name' definition eleemnts from an interface.
7"""
8
9
10class ServiceName(NamedElement):
11    def __init__(self, **kwargs):
12        if "default" in kwargs:
13            kwargs["name"] = "DefaultService"
14            self.value = kwargs.pop("default")
15        else:
16            self.value = kwargs.pop("value", False)
17
18        # Validate service name format.
19        if len(self.value) == 0:
20            raise ValueError("Invalid empty service-name")
21        for s in self.value.split("."):
22            if len(s) == 0:
23                raise ValueError(
24                    "Service names cannot have consecutive .:"
25                    f" {self.value} {s}"
26                )
27            if re.search("[^a-zA-Z0-9_]", s):
28                raise ValueError(
29                    f"Service name contains illegal characters: {self.value}"
30                )
31            if s[0] in string.digits:
32                raise ValueError(
33                    "Service name segments may not start with a number:"
34                    f" {self.value} {s}"
35                )
36
37        super(ServiceName, self).__init__(**kwargs)
38