docs: @Nullable
    static LineOptions fromFeature(@NonNull Feature feature) {
      if (feature.geometry() == null) {
        throw new RuntimeException("geometry field is required");
      }
      if (!(feature.geometry() instanceof LineString)) {
        return null;
      }
  
      LineOptions options = new LineOptions();
      options.geometry = (LineString) feature.geometry();
      if (feature.hasProperty(PROPERTY_LINE_JOIN)) {
        options.lineJoin = feature.getProperty(PROPERTY_LINE_JOIN).getAsString();
      }
      if (feature.hasProperty(PROPERTY_LINE_OPACITY)) {
        options.lineOpacity = feature.getProperty(PROPERTY_LINE_OPACITY).getAsFloat();
      }
      if (feature.hasProperty(PROPERTY_LINE_COLOR)) {
        options.lineColor = feature.getProperty(PROPERTY_LINE_COLOR).getAsString();
      }
      if (feature.hasProperty(PROPERTY_LINE_WIDTH)) {
        options.lineWidth = feature.getProperty(PROPERTY_LINE_WIDTH).getAsFloat();
      }
      if (feature.hasProperty(PROPERTY_LINE_GAP_WIDTH)) {
        options.lineGapWidth = feature.getProperty(PROPERTY_LINE_GAP_WIDTH).getAsFloat();
      }
      if (feature.hasProperty(PROPERTY_LINE_OFFSET)) {
        options.lineOffset = feature.getProperty(PROPERTY_LINE_OFFSET).getAsFloat();
      }
      if (feature.hasProperty(PROPERTY_LINE_BLUR)) {
        options.lineBlur = feature.getProperty(PROPERTY_LINE_BLUR).getAsFloat();
      }
      if (feature.hasProperty(PROPERTY_LINE_PATTERN)) {
        options.linePattern = feature.getProperty(PROPERTY_LINE_PATTERN).getAsString();
      }
      if (feature.hasProperty(PROPERTY_IS_DRAGGABLE)) {
        options.isDraggable = feature.getProperty(PROPERTY_IS_DRAGGABLE).getAsBoolean();
      }
      return options;
    }