001/* 002 * SPDX-License-Identifier: Apache-2.0 003 * 004 * Copyright 2024-2026 The Enola <https://enola.dev> Authors 005 * 006 * Licensed under the Apache License, Version 2.0 (the "License"); 007 * you may not use this file except in compliance with the License. 008 * You may obtain a copy of the License at 009 * 010 * https://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018package dev.enola.common.convert; 019 020import java.io.IOException; 021import java.util.Optional; 022import java.util.function.Function; 023 024public class ObjectConverter<X, Y> implements ObjectClassConverter<X> { 025 026 // See also ObjectToStringWithToStringBiConverter, which is similar, but the "opposite" 027 028 private final Class<Y> to; 029 private final Class<X> from; 030 protected Function<X, Y> converter; 031 032 public ObjectConverter(Class<X> from, Class<Y> to, Function<X, Y> converter) { 033 this.to = to; 034 this.from = from; 035 this.converter = converter; 036 } 037 038 @Override 039 public <T> Optional<T> convertToType(X input, Class<T> type) throws IOException { 040 // See also ObjectToStringBiConverter's & other similar convertToType() implementations 041 // TODO Re-consider class.equals -VS- isAssignableFrom, here & in ObjectToStringBiConverter 042 if (to.equals(type) && input != null && from.equals(input.getClass())) { 043 return Optional.of((T) converter.apply(input)); 044 } 045 return Optional.empty(); 046 } 047}