All Downloads are FREE. Search and download functionalities are using the official Maven repository.

functionalj.result.Specs Maven / Gradle / Ivy

// ============================================================================
// Copyright (c) 2017-2019 Nawapunth Manusitthipol (NawaMan - http://nawaman.net).
// ----------------------------------------------------------------------------
// MIT License
// 
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
// 
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// 
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
// ============================================================================
package functionalj.result;

import static nullablej.nullable.Nullable.nullable;

import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Function;

import functionalj.validator.Validator;
import lombok.val;

public class Specs {
    
//    @functionalj.types.Choice
    public static interface ValidationSpec {
        void ToBoolean  (Function             checker, String messageTemplate);
        void ToMessage  (Function              errorMsg);
        void ToException(Function errorChecker);
        
        // TODO - BUG!!! ... the method has to return something can't be void. ... fix this when can.
        default boolean ensureValid(Validation self, D data) {
            val validationException = validate(self, data);
            if (validationException != null)
                throw validationException;
            
            return true;
        }
        default ValidationException validate(Validation validation, D data) {
            val validationException = validation.match()
                    .toBoolean  (v -> $inner.checkToBoolean  (v, data))
                    .toMessage  (v -> $inner.checkToMessage  (v, data))
                    .toException(v -> $inner.checkToException(v, data));
            return validationException;
        }
        default Validator toValidator(Validation self) {
            val ref = new AtomicReference();
            return Validator.of(data -> {
                        ref.set(validate(self, data));
                        return (ref.get() == null);
                    },
                    (__, ___) -> ref.get());
        }
        
        static class $inner {
            
            static  ValidationException checkToBoolean(Validation.ToBoolean validating, D data) {
                return Result
                        .of  (()    -> validating.checker().apply(data))
                        .filter(valid -> !valid)
                        .map   (__    -> new ValidationException(getErrorMessage(validating, data)))
                        .get   ();
            }
            private static  String getErrorMessage(Validation.ToBoolean validating, D data) {
                return nullable(validating.messageTemplate())
                        .map   (template -> String.format(template, data))
                        .get   ();
            }
            static  ValidationException checkToMessage(Validation.ToMessage validating, D data) {
                return Result
                        .of(()     -> validating.errorMsg().apply(data))
                        .map (errMsg -> new ValidationException(errMsg))
                        .get ();
            }
            static  ValidationException checkToException(Validation.ToException validating, D data) {
                val exception = validating.errorChecker().apply(data);
                return exception;
            }
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy