Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 2 additions & 102 deletions pkg/workflow/create_project.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,110 +50,10 @@ func (c *Compiler) parseCreateProjectsConfig(outputMap map[string]any) *CreatePr
}

// Parse views if specified
if viewsData, exists := configMap["views"]; exists {
if viewsList, ok := viewsData.([]any); ok {
for i, viewItem := range viewsList {
if viewMap, ok := viewItem.(map[string]any); ok {
view := ProjectView{}

// Parse name (required)
if name, exists := viewMap["name"]; exists {
if nameStr, ok := name.(string); ok {
view.Name = nameStr
}
}

// Parse layout (required)
if layout, exists := viewMap["layout"]; exists {
if layoutStr, ok := layout.(string); ok {
view.Layout = layoutStr
}
}

// Parse filter (optional)
if filter, exists := viewMap["filter"]; exists {
if filterStr, ok := filter.(string); ok {
view.Filter = filterStr
}
}

// Parse visible-fields (optional)
if visibleFields, exists := viewMap["visible-fields"]; exists {
if fieldsList, ok := visibleFields.([]any); ok {
for _, field := range fieldsList {
if fieldInt, ok := field.(int); ok {
view.VisibleFields = append(view.VisibleFields, fieldInt)
}
}
}
}

// Parse description (optional)
if description, exists := viewMap["description"]; exists {
if descStr, ok := description.(string); ok {
view.Description = descStr
}
}

// Only add view if it has required fields
if view.Name != "" && view.Layout != "" {
createProjectsConfig.Views = append(createProjectsConfig.Views, view)
createProjectLog.Printf("Parsed view %d: %s (%s)", i+1, view.Name, view.Layout)
} else {
createProjectLog.Printf("Skipping invalid view %d: missing required fields", i+1)
}
}
}
}
}
createProjectsConfig.Views = parseProjectViews(configMap, createProjectLog)

// Parse field-definitions if specified
fieldsData, hasFields := configMap["field-definitions"]
if !hasFields {
// Allow underscore variant as well
fieldsData, hasFields = configMap["field_definitions"]
}
if hasFields {
if fieldsList, ok := fieldsData.([]any); ok {
for i, fieldItem := range fieldsList {
fieldMap, ok := fieldItem.(map[string]any)
if !ok {
continue
}

field := ProjectFieldDefinition{}

if name, exists := fieldMap["name"]; exists {
if nameStr, ok := name.(string); ok {
field.Name = nameStr
}
}

dataType, hasDataType := fieldMap["data-type"]
if !hasDataType {
dataType = fieldMap["data_type"]
}
if dataTypeStr, ok := dataType.(string); ok {
field.DataType = dataTypeStr
}

if options, exists := fieldMap["options"]; exists {
if optionsList, ok := options.([]any); ok {
for _, opt := range optionsList {
if optStr, ok := opt.(string); ok {
field.Options = append(field.Options, optStr)
}
}
}
}

if field.Name != "" && field.DataType != "" {
createProjectsConfig.FieldDefinitions = append(createProjectsConfig.FieldDefinitions, field)
createProjectLog.Printf("Parsed field definition %d: %s (%s)", i+1, field.Name, field.DataType)
}
}
}
}
createProjectsConfig.FieldDefinitions = parseProjectFieldDefinitions(configMap, createProjectLog)
}

createProjectLog.Printf("Parsed create-project config: max=%d, hasCustomToken=%v, hasTargetOwner=%v, hasTitlePrefix=%v, viewCount=%d, fieldDefinitionCount=%d",
Expand Down
130 changes: 130 additions & 0 deletions pkg/workflow/project_config_parsing.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
package workflow

import "github.com/github/gh-aw/pkg/logger"

// parseProjectViews parses the "views" list from a project config map.
// Only views with both name and layout fields are included; invalid ones are skipped.
func parseProjectViews(configMap map[string]any, log *logger.Logger) []ProjectView {
viewsData, exists := configMap["views"]
if !exists {
return nil
}
viewsList, ok := viewsData.([]any)
if !ok {
return nil
}

var views []ProjectView
for i, viewItem := range viewsList {
viewMap, ok := viewItem.(map[string]any)
if !ok {
continue
}
view := ProjectView{}

// Parse name (required)
if name, exists := viewMap["name"]; exists {
if nameStr, ok := name.(string); ok {
view.Name = nameStr
}
}

// Parse layout (required)
if layout, exists := viewMap["layout"]; exists {
if layoutStr, ok := layout.(string); ok {
view.Layout = layoutStr
}
}

// Parse filter (optional)
if filter, exists := viewMap["filter"]; exists {
if filterStr, ok := filter.(string); ok {
view.Filter = filterStr
}
}

// Parse visible-fields (optional)
if visibleFields, exists := viewMap["visible-fields"]; exists {
if fieldsList, ok := visibleFields.([]any); ok {
for _, field := range fieldsList {
if fieldInt, ok := field.(int); ok {
view.VisibleFields = append(view.VisibleFields, fieldInt)
}
}
}
}

// Parse description (optional)
if description, exists := viewMap["description"]; exists {
if descStr, ok := description.(string); ok {
view.Description = descStr
}
}

// Only add view if it has required fields
if view.Name != "" && view.Layout != "" {
views = append(views, view)
log.Printf("Parsed view %d: %s (%s)", i+1, view.Name, view.Layout)
} else {
log.Printf("Skipping invalid view %d: missing required fields", i+1)
}
}
return views
}

// parseProjectFieldDefinitions parses the "field-definitions" (or "field_definitions") list
// from a project config map. Only fields with both name and data-type are included.
func parseProjectFieldDefinitions(configMap map[string]any, log *logger.Logger) []ProjectFieldDefinition {
fieldsData, hasFields := configMap["field-definitions"]
if !hasFields {
// Allow underscore variant as well
fieldsData, hasFields = configMap["field_definitions"]
}
if !hasFields {
return nil
}
fieldsList, ok := fieldsData.([]any)
if !ok {
return nil
}

var fields []ProjectFieldDefinition
for i, fieldItem := range fieldsList {
fieldMap, ok := fieldItem.(map[string]any)
if !ok {
continue
}

field := ProjectFieldDefinition{}

if name, exists := fieldMap["name"]; exists {
if nameStr, ok := name.(string); ok {
field.Name = nameStr
}
}

dataType, hasDataType := fieldMap["data-type"]
if !hasDataType {
dataType = fieldMap["data_type"]
}
if dataTypeStr, ok := dataType.(string); ok {
field.DataType = dataTypeStr
}

if options, exists := fieldMap["options"]; exists {
if optionsList, ok := options.([]any); ok {
for _, opt := range optionsList {
if optStr, ok := opt.(string); ok {
field.Options = append(field.Options, optStr)
}
}
}
}

if field.Name != "" && field.DataType != "" {
fields = append(fields, field)
log.Printf("Parsed field definition %d: %s (%s)", i+1, field.Name, field.DataType)
}
}
return fields
}
Loading
Loading