@Override
    public Object apply(String key) {
      if (key != null) {
        return switch (key) {
          case FEATURE_TAGS -> mapWithDefault(tagValueProducer.mapTags(feature), NullValue.NULL_VALUE);
          case FEATURE_ID -> feature.id();
          case FEATURE_SOURCE -> feature.getSource();
          case FEATURE_SOURCE_LAYER -> wrapNullable(feature.getSourceLayer());
          case FEATURE_GEOMETRY -> new GeometryVal(feature);
          default -> {
            OsmElement elem = feature instanceof OsmSourceFeature osm ? osm.originalElement() : null;
            if (FEATURE_OSM_TYPE.equals(key)) {
              yield elem == null ? null : elem.type().name().toLowerCase();
            }
            OsmElement.Info info = elem != null ? elem.info() : null;
            yield info == null ? null : switch (key) {
              case FEATURE_OSM_CHANGESET -> info.changeset();
              case FEATURE_OSM_VERSION -> info.version();
              case FEATURE_OSM_TIMESTAMP -> info.timestamp();
              case FEATURE_OSM_USER_ID -> info.userId();
              case FEATURE_OSM_USER_NAME -> wrapNullable(info.user());
              default -> null;
            };
          }
        };
      } else {
        return null;
      }
    }
Context available when processing an input feature.

@param feature          The input feature being processed
@param tagValueProducer Common parsing for input feature tags
planetiler-custommap/src/main/java/com/onthegomap/planetiler/custommap/Contexts.java