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