From 39f8bba30c51f4128422fb3fba56fe0c92d3d0fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= <hugo@lysator.liu.se> Date: Thu, 21 Sep 2023 01:31:31 +0200 Subject: [PATCH] Handle virtual and exported resources. --- muppet/puppet/ast.py | 12 ++++++++++++ muppet/puppet/format/parser.py | 9 ++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/muppet/puppet/ast.py b/muppet/puppet/ast.py index c80f428..5b4afb9 100644 --- a/muppet/puppet/ast.py +++ b/muppet/puppet/ast.py @@ -336,6 +336,9 @@ class PuppetResource(PuppetAST): type: PuppetAST bodies: list[tuple[PuppetAST, list[PuppetInstanciationParameter]]] + # Marks if the resource is virtual or exported. + # A single '@' means virtual, two '@' ('@@') means exported. + form: Optional[str] = None @dataclass @@ -717,6 +720,15 @@ def build_ast(form: Any) -> PuppetAST: case ['regexp', s]: return PuppetRegex(s) + case ['resource', {'type': t, 'bodies': bodies, 'form': form}]: + assert form in {'exported', 'virtual'} + return PuppetResource( + build_ast(t), + [(build_ast(body['title']), + [parse_puppet_instanciation_param(x) for x in body['ops']]) + for body in bodies], + form) + case ['resource', {'type': t, 'bodies': bodies}]: return PuppetResource( build_ast(t), diff --git a/muppet/puppet/format/parser.py b/muppet/puppet/format/parser.py index 0607448..0ad5bb1 100644 --- a/muppet/puppet/format/parser.py +++ b/muppet/puppet/format/parser.py @@ -616,7 +616,14 @@ class ParserFormatter(Serializer[ParseDirective]): @override def _puppet_resource(self, it: PuppetResource) -> ParseDirective: - parser = ws & self.s(it.type) & ws & '{' + parser: ParseDirective = ws + match it.form: + case 'virtual': + parser &= '@' + case 'exported': + parser &= '@@' + + parser &= ws & self.s(it.type) & ws & '{' for key, params in it.bodies: parser &= ws & self.s(key) & ws & ':' for param in params: -- GitLab