1
2
3
4
5
6
7 package com.varmateo.yawg.core;
8
9 import java.util.Optional;
10 import java.util.function.Function;
11
12 import io.vavr.collection.Seq;
13 import io.vavr.control.Option;
14
15 import com.varmateo.yawg.api.YawgException;
16 import com.varmateo.yawg.spi.Template;
17 import com.varmateo.yawg.spi.TemplateService;
18
19
20
21
22
23 final class CollectiveTemplateService
24 implements TemplateService {
25
26
27 private final Function<String, Optional<Template>> _templateFetcher;
28
29
30 private CollectiveTemplateService(final Seq<TemplateService> services) {
31
32 if ( services.isEmpty() ) {
33 _templateFetcher = name -> Optional.empty();
34 } else {
35 _templateFetcher = name -> prepareTemplateFromServices(services, name);
36 }
37 }
38
39
40
41
42
43 public static TemplateService create(final Seq<TemplateService> services) {
44 return new CollectiveTemplateService(services);
45 }
46
47
48
49
50
51 @Override
52 public Optional<Template> prepareTemplate(final String name) {
53
54 return _templateFetcher.apply(name);
55 }
56
57
58
59
60
61 private static Optional<Template> prepareTemplateFromServices(
62 final Seq<TemplateService> services,
63 final String name) {
64
65 final Option<Template> result = services
66 .map(service -> service.prepareTemplate(name))
67 .map(Option::ofOptional)
68 .filter(Option::isDefined)
69 .map(Option::get)
70 .headOption();
71
72 if ( !result.isDefined() ) {
73 throw CollectiveTemplateServiceException.unsupportedTemplateFormat(name);
74 }
75
76 return result.toJavaOptional();
77 }
78
79
80 }