code: func SubStepsToUI(c context.Context, ub URLBuilder, substeps []*miloProto.Step_Substep) ([]*ui.BuildComponent, []*ui.PropertyGroup) {
  	components := make([]*ui.BuildComponent, 0, len(substeps))
  	propGroups := make([]*ui.PropertyGroup, 0, len(substeps)+1) // This is the max number or property groups.
  	for _, substepContainer := range substeps {
  		anno := substepContainer.GetStep()
  		if anno == nil {
  			// TODO: We ignore non-embedded substeps for now.
  			continue
  		}
  
  		bs := miloBuildStep(c, ub, anno, true)
  		components = append(components, &bs)
  		addPropGroups(&propGroups, &bs, anno)
  	}
  
  	return components, propGroups
  }
docs: // SubStepsToUI converts a slice of annotation substeps to ui.BuildComponent and
  // slice of ui.PropertyGroups.