/**
* Copyright (C) 2015 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.measure.fx;
import java.util.Optional;
import com.opengamma.strata.basics.ReferenceData;
import com.opengamma.strata.basics.currency.FxRate;
import com.opengamma.strata.calc.marketdata.MarketDataConfig;
import com.opengamma.strata.calc.marketdata.MarketDataFunction;
import com.opengamma.strata.calc.marketdata.MarketDataRequirements;
import com.opengamma.strata.data.FxRateId;
import com.opengamma.strata.data.scenario.MarketDataBox;
import com.opengamma.strata.data.scenario.ScenarioMarketData;
import com.opengamma.strata.market.observable.QuoteId;
/**
* Function which builds {@link FxRate} instances from observable market data.
* <p>
* {@link FxRateConfig} defines which market data is used to build the FX rates.
*/
public class FxRateMarketDataFunction implements MarketDataFunction<FxRate, FxRateId> {
@Override
public MarketDataRequirements requirements(FxRateId id, MarketDataConfig marketDataConfig) {
FxRateConfig fxRateConfig = marketDataConfig.get(FxRateConfig.class, id.getObservableSource());
Optional<QuoteId> optional = fxRateConfig.getObservableRateKey(id.getPair());
return optional.map(key -> MarketDataRequirements.of(key)).orElse(MarketDataRequirements.empty());
}
@Override
public MarketDataBox<FxRate> build(
FxRateId id,
MarketDataConfig marketDataConfig,
ScenarioMarketData marketData,
ReferenceData refData) {
FxRateConfig fxRateConfig = marketDataConfig.get(FxRateConfig.class, id.getObservableSource());
Optional<QuoteId> optional = fxRateConfig.getObservableRateKey(id.getPair());
return optional.map(key -> buildFxRate(id, key, marketData))
.orElseThrow(() -> new IllegalArgumentException("No FX rate configuration available for " + id.getPair()));
}
private MarketDataBox<FxRate> buildFxRate(
FxRateId id,
QuoteId key,
ScenarioMarketData marketData) {
MarketDataBox<Double> quote = marketData.getValue(key);
return quote.map(rate -> FxRate.of(id.getPair(), rate));
}
@Override
public Class<FxRateId> getMarketDataIdType() {
return FxRateId.class;
}
}