/**
* Copyright (C) 2016 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.strata.measure.curve;
import com.opengamma.strata.basics.ReferenceData;
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.collect.Messages;
import com.opengamma.strata.data.scenario.MarketDataBox;
import com.opengamma.strata.data.scenario.ScenarioMarketData;
import com.opengamma.strata.market.curve.Curve;
import com.opengamma.strata.market.curve.CurveGroup;
import com.opengamma.strata.market.curve.CurveGroupId;
import com.opengamma.strata.market.curve.CurveId;
/**
* Market data function that locates a curve by name.
* <p>
* This function finds an instance of {@link Curve} using the name held in {@link CurveId}.
* <p>
* The curve is not actually built in this class, it is extracted from an existing {@link CurveGroup}.
* The curve group must be available in the {@code MarketDataLookup} passed to the {@link #build} method.
*/
public class CurveMarketDataFunction
implements MarketDataFunction<Curve, CurveId> {
@Override
public MarketDataRequirements requirements(CurveId id, MarketDataConfig config) {
CurveGroupId curveGroupId = CurveGroupId.of(id.getCurveGroupName(), id.getObservableSource());
return MarketDataRequirements.builder()
.addValues(curveGroupId)
.build();
}
@Override
public MarketDataBox<Curve> build(
CurveId id,
MarketDataConfig config,
ScenarioMarketData marketData,
ReferenceData refData) {
// find curve
CurveGroupId curveGroupId = CurveGroupId.of(id.getCurveGroupName(), id.getObservableSource());
MarketDataBox<CurveGroup> curveGroupBox = marketData.getValue(curveGroupId);
return curveGroupBox.map(curveGroup -> findCurve(id, curveGroup));
}
// finds the curve
private Curve findCurve(CurveId id, CurveGroup curveGroup) {
return curveGroup.findCurve(id.getCurveName())
.orElseThrow(() -> new IllegalArgumentException(Messages.format("No curve found: {}", id.getCurveName())));
}
@Override
public Class<CurveId> getMarketDataIdType() {
return CurveId.class;
}
}