From f011b0cb89f803d19865f0d827eeeef7f6873aca Mon Sep 17 00:00:00 2001 From: Guillaume Dugas Date: Wed, 25 Feb 2026 16:53:11 +0100 Subject: [PATCH] Ajout du filtre json --- .../blocks/pebble/PebbleJsonFilterTest.java | 56 +++++++++++++++++++ .../blocks/pebble/PebbleBlocksExtension.java | 11 ++++ .../blocks/pebble/PebbleJsonFilter.java | 35 ++++++++++++ 3 files changed, 102 insertions(+) create mode 100644 modules/core/deployment/src/test/java/fr/cnd/compositor/blocks/pebble/PebbleJsonFilterTest.java create mode 100644 modules/core/runtime/src/main/java/fr/cnd/compositor/blocks/pebble/PebbleJsonFilter.java diff --git a/modules/core/deployment/src/test/java/fr/cnd/compositor/blocks/pebble/PebbleJsonFilterTest.java b/modules/core/deployment/src/test/java/fr/cnd/compositor/blocks/pebble/PebbleJsonFilterTest.java new file mode 100644 index 0000000..7d4ea1f --- /dev/null +++ b/modules/core/deployment/src/test/java/fr/cnd/compositor/blocks/pebble/PebbleJsonFilterTest.java @@ -0,0 +1,56 @@ +package fr.cnd.compositor.blocks.pebble; + +import io.quarkus.test.junit.QuarkusTest; +import jakarta.inject.Inject; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@QuarkusTest +class PebbleJsonFilterTest { + + @Inject + PebbleBlockEngine pebbleBlockEngine; + + @Test + void shouldSerializeString() { + String result = render("{{ value | json }}", Map.of("value", "hello")); + + assertEquals("\"hello\"", result); + } + + @Test + void shouldSerializeInteger() { + String result = render("{{ value | json }}", Map.of("value", 42)); + + assertEquals("42", result); + } + + @Test + void shouldSerializeMap() { + String result = render("{{ value | json }}", Map.of("value", Map.of("key", "val"))); + + assertEquals("{\"key\":\"val\"}", result); + } + + @Test + void shouldSerializeList() { + String result = render("{{ value | json }}", Map.of("value", List.of(1, 2, 3))); + + assertEquals("[1,2,3]", result); + } + + @Test + void shouldSerializeNull() { + String result = render("{{ value | json }}", Map.of()); + + assertEquals("null", result); + } + + private String render(String template, Map context) { + return pebbleBlockEngine.render(template, context).await().indefinitely(); + } +} diff --git a/modules/core/runtime/src/main/java/fr/cnd/compositor/blocks/pebble/PebbleBlocksExtension.java b/modules/core/runtime/src/main/java/fr/cnd/compositor/blocks/pebble/PebbleBlocksExtension.java index a4cb1e5..993ff0d 100644 --- a/modules/core/runtime/src/main/java/fr/cnd/compositor/blocks/pebble/PebbleBlocksExtension.java +++ b/modules/core/runtime/src/main/java/fr/cnd/compositor/blocks/pebble/PebbleBlocksExtension.java @@ -1,6 +1,7 @@ package fr.cnd.compositor.blocks.pebble; import io.pebbletemplates.pebble.extension.AbstractExtension; +import io.pebbletemplates.pebble.extension.Filter; import io.pebbletemplates.pebble.extension.Function; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; @@ -12,8 +13,18 @@ public class PebbleBlocksExtension extends AbstractExtension { @Inject PebbleSlotFunction pebbleSlotFunction; + + @Inject + PebbleJsonFilter pebbleJsonFilter; + + @Override public Map getFunctions() { return Map.of("slot", pebbleSlotFunction); } + @Override + public Map getFilters() { + return Map.of("json", pebbleJsonFilter); + } + } diff --git a/modules/core/runtime/src/main/java/fr/cnd/compositor/blocks/pebble/PebbleJsonFilter.java b/modules/core/runtime/src/main/java/fr/cnd/compositor/blocks/pebble/PebbleJsonFilter.java new file mode 100644 index 0000000..e7b7b5a --- /dev/null +++ b/modules/core/runtime/src/main/java/fr/cnd/compositor/blocks/pebble/PebbleJsonFilter.java @@ -0,0 +1,35 @@ +package fr.cnd.compositor.blocks.pebble; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.pebbletemplates.pebble.error.PebbleException; +import io.pebbletemplates.pebble.extension.Filter; +import io.pebbletemplates.pebble.extension.escaper.SafeString; +import io.pebbletemplates.pebble.template.EvaluationContext; +import io.pebbletemplates.pebble.template.PebbleTemplate; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +import java.util.List; +import java.util.Map; + +@ApplicationScoped +public class PebbleJsonFilter implements Filter { + + @Inject + ObjectMapper objectMapper; + + @Override + public Object apply(Object input, Map args, PebbleTemplate self, EvaluationContext context, int lineNumber) { + try { + return new SafeString(objectMapper.writeValueAsString(input)); + } catch (JsonProcessingException e) { + throw new PebbleException(e, "Failed to serialize object to JSON", lineNumber, self.getName()); + } + } + + @Override + public List getArgumentNames() { + return List.of(); + } +}