ObjectResolverRegistry.java

package pro.verron.officestamper.core;

import org.jspecify.annotations.Nullable;
import pro.verron.officestamper.api.DocxPart;
import pro.verron.officestamper.api.Insert;
import pro.verron.officestamper.api.ObjectResolver;
import pro.verron.officestamper.api.OfficeStamperException;

import java.util.ArrayList;
import java.util.List;

/// A registry for object resolvers. It allows registering and resolving object resolvers based on certain criteria.
///
/// @author Joseph Verron
/// @version ${version}
/// @since 1.6.7
public final class ObjectResolverRegistry {
    private final List<ObjectResolver> resolvers = new ArrayList<>();

    /// A registry for object resolvers.
    ///
    /// It allows registering and resolving object resolvers based on certain criteria.
    ///
    /// @param resolvers the ordered list of object resolvers to be registered in the registry
    public ObjectResolverRegistry(List<ObjectResolver> resolvers) {
        this.resolvers.addAll(resolvers);
    }

    /// Resolves the expression in the given document with the provided object.
    ///
    /// @param part       the document part in which to resolve the placeholder.
    /// @param expression the expression to resolve.
    /// @param object     the object to be used for resolving the expression.
    /// @return the resolved value for the expression.
    /// @throws OfficeStamperException if no resolver is found for the object.
    public Insert resolve(DocxPart part, String expression, @Nullable Object object) {
        for (ObjectResolver resolver : resolvers)
            if (resolver.canResolve(object)) return resolver.resolve(part, expression, object);
        throw new OfficeStamperException("No resolver for %s".formatted(object));
    }
}