001/*
002 * Copyright 2024-2025 Revetware LLC.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017package com.soklet.servlet.javax;
018
019import javax.annotation.Nonnull;
020import javax.annotation.Nullable;
021import java.util.Locale;
022
023import static java.util.Objects.requireNonNull;
024
025/**
026 * The set of all possible event payloads emittable by {@link SokletServletPrintWriter}.
027 *
028 * @author <a href="https://www.revetkn.com">Mark Allen</a>
029 */
030public sealed interface SokletServletPrintWriterEvent permits
031                SokletServletPrintWriterEvent.CharsWritten,
032                SokletServletPrintWriterEvent.CharWritten,
033                SokletServletPrintWriterEvent.StringWritten,
034                SokletServletPrintWriterEvent.ValuePrinted,
035                SokletServletPrintWriterEvent.ValueWithNewlinePrinted,
036                SokletServletPrintWriterEvent.NewlinePrinted,
037                SokletServletPrintWriterEvent.PrintfPerformed,
038                SokletServletPrintWriterEvent.FormatPerformed,
039                SokletServletPrintWriterEvent.CharSequenceAppended,
040                SokletServletPrintWriterEvent.CharAppended {
041
042        /**
043         * Event emitted when a {@code char[]} is written to the {@link SokletServletPrintWriter}.
044         */
045        record CharsWritten(
046                        @Nonnull char[] chars,
047                        int offset,
048                        int length
049        ) implements SokletServletPrintWriterEvent {
050                public CharsWritten {
051                        requireNonNull(chars);
052                }
053        }
054
055        /**
056         * Event emitted when an {@code int} (character) is written to the {@link SokletServletPrintWriter}.
057         */
058        record CharWritten(
059                        int ch
060        ) implements SokletServletPrintWriterEvent {}
061
062        /**
063         * Event emitted when a {@link String} is written to the {@link SokletServletPrintWriter}.
064         */
065        record StringWritten(
066                        @Nonnull String string,
067                        int offset,
068                        int length
069        ) implements SokletServletPrintWriterEvent {
070                public StringWritten {
071                        requireNonNull(string);
072                }
073        }
074
075        /**
076         * Event emitted when an {@link Object} value is written to the {@link SokletServletPrintWriter}.
077         */
078        record ValuePrinted(
079                        @Nullable Object value
080        ) implements SokletServletPrintWriterEvent {}
081
082        /**
083         * Event emitted when an {@link Object} value with a newline is written to the {@link SokletServletPrintWriter}.
084         */
085        record ValueWithNewlinePrinted(
086                        @Nullable Object value
087        ) implements SokletServletPrintWriterEvent {}
088
089        /**
090         * Event emitted when a newline is written to the {@link SokletServletPrintWriter}.
091         */
092        record NewlinePrinted() implements SokletServletPrintWriterEvent {}
093
094        /**
095         * Event emitted when the result of a "printf" operation is written to the {@link SokletServletPrintWriter}.
096         */
097        record PrintfPerformed(
098                        @Nullable Locale locale,
099                        @Nonnull String format,
100                        @Nonnull Object[] args
101        ) implements SokletServletPrintWriterEvent {
102                public PrintfPerformed {
103                        requireNonNull(format);
104                        requireNonNull(args);
105                }
106        }
107
108        /**
109         * Event emitted when the result of a "format" operation is written to the {@link SokletServletPrintWriter}.
110         */
111        record FormatPerformed(
112                        @Nullable Locale locale,
113                        @Nonnull String format,
114                        @Nonnull Object[] args
115        ) implements SokletServletPrintWriterEvent {
116                public FormatPerformed {
117                        requireNonNull(format);
118                        requireNonNull(args);
119                }
120        }
121
122        /**
123         * Event emitted when a {@link CharSequence} is appended to the {@link SokletServletPrintWriter}.
124         */
125        record CharSequenceAppended(
126                        @Nonnull CharSequence charSequence,
127                        int start,
128                        int end
129        ) implements SokletServletPrintWriterEvent {
130                public CharSequenceAppended {
131                        requireNonNull(charSequence);
132                }
133        }
134
135        /**
136         * Event emitted when a {@code char} is appended to the {@link SokletServletPrintWriter}.
137         */
138        record CharAppended(
139                        char ch
140        ) implements SokletServletPrintWriterEvent {
141                public CharAppended {}
142        }
143}