Hooks.java

package pro.verron.officestamper.api;

import org.docx4j.wml.CTSmartTagRun;
import org.docx4j.wml.ContentAccessor;
import pro.verron.officestamper.utils.iterator.ResetableIterator;
import pro.verron.officestamper.utils.wml.DocxIterator;
import pro.verron.officestamper.utils.wml.WmlUtils;

/// Provides utility methods for working with [Hook] instances in the context of a WordprocessingML-based document. The
/// `Hooks` class contains static methods to create and manage [ResetableIterator] instances of hooks for a given
/// document part. These hooks allow the customization or extension of document processing behavior in a flexible and
/// context-driven manner.
public class Hooks {

    private Hooks() {
        throw new IllegalStateException("Utility class");
    }

    /// Creates a [ResetableIterator] of Hook instances for a specific document part, based on the provided content
    /// accessor. This method filters potential hooks from the content and maps them to Hook instances associated with
    /// the given document part.
    ///
    /// @param contentAccessor the content accessor providing access to the document's content
    ///
    /// @return a [ResetableIterator] of Hook instances for the specified document part
    public static ResetableIterator<Hook> ofHooks(ContentAccessor contentAccessor) {
        return new DocxIterator(contentAccessor).filter(Hooks::isHook)
                                                .map(Hooks::asHook);
    }

    private static boolean isHook(Object o) {
        return o instanceof CTSmartTagRun tag && WmlUtils.isTagElement(tag, "officestamper");
    }

    private static Hook asHook(Object o) {
        if (o instanceof CTSmartTagRun tag && WmlUtils.isTagElement(tag, "officestamper"))
            return contextKey -> WmlUtils.setTagAttribute(tag, "context", contextKey);
        throw new IllegalArgumentException("Unexpected value: " + o);
    }
}