/*
* Copyright 2016-present Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
package com.facebook.buck.config;
import org.immutables.value.Value;
/**
* A view of a particular config class.
*
* <p>A config class may implement extra state and accessors beyond the bare Config. ConfigViews
* provides domain-specific accessors to Config values.
*
* <p>ConfigViews should be defined following this pattern.
*
* <pre>{@code
* @Value.Immutable(builder=false, copy=false)
* @BuckStyleImmutable
* abstract class AbstractFooConfigView implements ConfigView<FooConfig> {
*
* // Additional accessors.
* }
*
* }</pre>
*
* Config views should also not declare any additional non-derived immutable fields if it's to be
* used with {@link ConfigViewCache}. As the cache assumes one-to-one correspondence with the main
* config instance, it uses the generated factory {@code FooConfigView.of(T delegate)} to
* instantiate the view.
*
* @param <T> Config type.
*/
public interface ConfigView<T> {
@Value.Parameter
T getDelegate();
}