001/*
002 * ============================================================================
003 *  Copyright © 2002-2026 by Thomas Thrien.
004 *  All Rights Reserved.
005 * ============================================================================
006 *  Licensed to the public under the agreements of the GNU Lesser General Public
007 *  License, version 3.0 (the "License"). You may obtain a copy of the License at
008 *
009 *       http://www.gnu.org/licenses/lgpl.html
010 *
011 *  Unless required by applicable law or agreed to in writing, software
012 *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
013 *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
014 *  License for the specific language governing permissions and limitations
015 *  under the License.
016 */
017
018package org.tquadrat.foundation.jsonbuilder.internal;
019
020import static java.lang.String.format;
021import static java.util.Locale.ROOT;
022import static org.apiguardian.api.API.Status.INTERNAL;
023import static org.tquadrat.foundation.lang.Objects.requireNonNullArgument;
024import static org.tquadrat.foundation.lang.Objects.requireValidIntegerArgument;
025
026import java.math.BigDecimal;
027import java.math.BigInteger;
028import java.util.Formatter;
029
030import org.apiguardian.api.API;
031import org.tquadrat.foundation.annotation.ClassVersion;
032import org.tquadrat.foundation.jsonbuilder.JSONArray;
033import org.tquadrat.foundation.jsonbuilder.JSONBuilder;
034import org.tquadrat.foundation.jsonbuilder.JSONNumber;
035import org.tquadrat.foundation.jsonbuilder.JSONObject;
036import org.tquadrat.foundation.jsonbuilder.JSONString;
037import org.tquadrat.foundation.jsonbuilder.JSONValue;
038
039/**
040 *  <p>{@summary The implementation for the interface
041 *  {@link JSONBuilder}.}
042 *
043 *  @extauthor Thomas Thrien - thomas.thrien@tquadrat.org
044 *  @version $Id: JSONBuilderImpl.java 1190 2026-04-08 13:27:20Z tquadrat $
045 *  @since 0.25.0
046 *
047 *  @UMLGraph.link
048 */
049@ClassVersion( sourceVersion = "$Id: JSONBuilderImpl.java 1190 2026-04-08 13:27:20Z tquadrat $" )
050@API( status = INTERNAL, since = "0.25.0" )
051public final class JSONBuilderImpl implements JSONBuilder
052{
053        /*------------*\
054    ====** Attributes **=======================================================
055        \*------------*/
056    /**
057     *  The indentation that is used when a
058     *  {@link JSONValue}
059     *  is formatted.
060     *
061     *  @see JSONValue#formatTo(Formatter,int,int,int)
062     */
063    private int m_Indentation;
064
065        /*--------------*\
066    ====** Constructors **=====================================================
067        \*--------------*/
068    /**
069     *  Creates a new instance of {@code JSONBuilder}.
070     */
071    public JSONBuilderImpl()
072    {
073        m_Indentation = DEFAULT_INDENTATION;
074    }   //  JSONBuilderImpl()
075
076        /*---------*\
077    ====** Methods **==========================================================
078        \*---------*/
079    /**
080     *  {@inheritDoc}
081     */
082    @Override
083    public final JSONArray createArray() { return new JSONArrayImpl( this ); }
084
085    /**
086     *  {@inheritDoc}
087     */
088    @Override
089    public final JSONObject createObject() { return new JSONObjectImpl( this ); }
090
091    /**
092     *  {@inheritDoc}
093     */
094    @Override
095    public final int getIndentation() { return m_Indentation; }
096
097    /**
098     *  {@inheritDoc}
099     */
100    @Override
101    public final void setIndentation( final int value )
102    {
103        m_Indentation = requireValidIntegerArgument( value, "value", v -> v > 0 );
104    }   //  setIndentation()
105
106    /**
107     *  {@inheritDoc}
108     */
109    @Override
110    public JSONNumber valueOf( final BigDecimal value )
111    {
112        final var retValue = new JSONNumberImpl( format( ROOT, "%f", requireNonNullArgument( value, "value" ) ) );
113
114        //---* Done *----------------------------------------------------------
115        return retValue;
116    }   //  valueOf()
117
118    /**
119     *  {@inheritDoc}
120     */
121    @Override
122    public JSONNumber valueOf( final BigInteger value )
123    {
124        final var retValue = new JSONNumberImpl( format( ROOT, "%d", requireNonNullArgument( value, "value" ) ) );
125
126        //---* Done *----------------------------------------------------------
127        return retValue;
128    }   //  valueOf()
129
130    /**
131     *  {@inheritDoc}
132     */
133    @Override
134    public JSONNumber valueOf( final double value )
135    {
136        final var retValue = new JSONNumberImpl( Double.toString( value ) );
137
138        //---* Done *----------------------------------------------------------
139        return retValue;
140    }   //  valueOf()
141
142    /**
143     *  {@inheritDoc}
144     */
145    @SuppressWarnings( "CallToNumericToString" )
146    @Override
147    public JSONNumber valueOf( final Double value )
148    {
149        final var retValue = new JSONNumberImpl( requireNonNullArgument( value, "value" ).toString() );
150
151        //---* Done *----------------------------------------------------------
152        return retValue;
153    }   //  valueOf()
154
155    /**
156     *  {@inheritDoc}
157     */
158    @Override
159    public JSONNumber valueOf( final float value )
160    {
161        final var retValue = new JSONNumberImpl( Float.toString( value ) );
162
163        //---* Done *----------------------------------------------------------
164        return retValue;
165    }   //  valueOf()
166
167    /**
168     *  {@inheritDoc}
169     */
170    @SuppressWarnings( "CallToNumericToString" )
171    @Override
172    public JSONNumber valueOf( final Float value )
173    {
174        final var retValue = new JSONNumberImpl( requireNonNullArgument( value, "value" ).toString() );
175
176        //---* Done *----------------------------------------------------------
177        return retValue;
178    }   //  valueOf()
179
180    /**
181     *  {@inheritDoc}
182     */
183    @Override
184    public JSONNumber valueOf( final int value )
185    {
186        final var retValue = new JSONNumberImpl( Integer.toString( value ) );
187
188        //---* Done *----------------------------------------------------------
189        return retValue;
190    }   //  valueOf()
191
192    /**
193     *  {@inheritDoc}
194     */
195    @SuppressWarnings( "CallToNumericToString" )
196    @Override
197    public JSONNumber valueOf( final Integer value )
198    {
199        final var retValue = new JSONNumberImpl( requireNonNullArgument( value, "value" ).toString() );
200
201        //---* Done *----------------------------------------------------------
202        return retValue;
203    }   //  valueOf()
204
205    /**
206     *  {@inheritDoc}
207     */
208    @Override
209    public JSONNumber valueOf( final long value )
210    {
211        final var retValue = new JSONNumberImpl( Long.toString( value ) );
212
213        //---* Done *----------------------------------------------------------
214        return retValue;
215    }   //  valueOf()
216
217    /**
218     *  {@inheritDoc}
219     */
220    @SuppressWarnings( "CallToNumericToString" )
221    @Override
222    public JSONNumber valueOf( final Long value )
223    {
224        final var retValue = new JSONNumberImpl( requireNonNullArgument( value, "value" ).toString() );
225
226        //---* Done *----------------------------------------------------------
227        return retValue;
228    }   //  valueOf()
229
230    /**
231     *  {@inheritDoc}
232     */
233    @Override
234    public JSONString valueOf( final String value )
235    {
236        final var retValue = new JSONStringImpl( requireNonNullArgument( value, "value" ) );
237
238        //---* Done *----------------------------------------------------------
239        return retValue;
240    }   //  valueOf()
241}
242//  class JSONBuilderImpl
243
244/*
245 *  End of File
246 */