001/* 002 * SPDX-License-Identifier: Apache-2.0 003 * 004 * Copyright 2025-2026 The Enola <https://enola.dev> Authors 005 * 006 * Licensed under the Apache License, Version 2.0 (the "License"); 007 * you may not use this file except in compliance with the License. 008 * You may obtain a copy of the License at 009 * 010 * https://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018package dev.enola.common.template; 019 020import dev.enola.common.io.resource.ReadableResource; 021 022import java.io.IOException; 023import java.util.Optional; 024 025/** 026 * Provider of {@link Template}. 027 * 028 * <p>Implementations could be based on various frameworks, such as those listed on <a 029 * href="https://github.com/akullpp/awesome-java?tab=readme-ov-file#template-engine">akullpp/awesome-java#template-engine</a> 030 * or <a 031 * href="https://github.com/sshailabh/awesome-template-engine?tab=readme-ov-file#java">sshailabh/awesome-template-engine</a>. 032 */ 033public interface TemplateProvider { 034 035 // TODO Write a CachingTemplateProvider 036 037 Optional<Template> optional(ReadableResource source) throws IOException; 038 039 default Template get(ReadableResource source) throws IOException { 040 return optional(source) 041 .orElseThrow( 042 () -> 043 new IOException( 044 getClass().getSimpleName() + " cannot read " + source)); 045 } 046}