{"record":{"id":"d6d0d318d79be1b4","repo":"hasura/graphql-engine","slug":"parsing-project-metadata-to-json-failed-w","errorCode":null,"errorMessage":"parsing project metadata to json failed: %w","messagePattern":"parsing project metadata to json failed: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cli/pkg/metadata/mode_handlers.go","lineNumber":75,"sourceCode":"\t\tb := new(bytes.Buffer)\n\t\tif err := json.NewEncoder(b).Encode(replaceMetadataResponse); err != nil {\n\t\t\treturn nil, errors.E(op, fmt.Errorf(\"encoding json response from server: %w\", err))\n\t\t}\n\n\t\treturn b, nil\n\t}\n\n\treturn nil, nil\n}\n\nfunc (m *metadataModeDirectoryHandler) Parse(p *ProjectMetadata) (io.Reader, error) {\n\tvar op errors.Op = \"metadata.metadataModeDirectoryHandler.Parse\"\n\n\tmetadataHandler := projectmetadata.NewHandlerFromEC(p.ec)\n\n\tjsonMetadata, err := metadataHandler.BuildJSONMetadata()\n\tif err != nil {\n\t\treturn nil, errors.E(op, fmt.Errorf(\"parsing project metadata to json failed: %w\", err))\n\t}\n\n\treturn bytes.NewReader(jsonMetadata), nil\n}\n\nfunc (m *metadataModeDirectoryHandler) Diff(p *ProjectMetadata) (io.Reader, error) {\n\tvar op errors.Op = \"metadata.metadataModeDirectoryHandler.Diff\"\n\n\tr, err := diff(p)\n\tif err != nil {\n\t\treturn nil, errors.E(op, err)\n\t}\n\n\treturn r, nil\n}\n\nfunc (m *metadataModeDirectoryHandler) Export(p *ProjectMetadata) (io.Reader, error) {\n\tvar op errors.Op = \"metadata.metadataModeDirectoryHandler.Export\"","sourceCodeStart":57,"sourceCodeEnd":93,"githubUrl":"https://github.com/hasura/graphql-engine/blob/724551b9ae87845594ef0408cff0e50eb6c90dc5/cli/pkg/metadata/mode_handlers.go#L57-L93","documentation":"The directory-mode metadata handler builds project metadata from metadata/ directories (tables.yaml, etc.) via BuildJSONMetadata; any failure is wrapped as 'parsing project metadata to json failed'. Root causes are usually invalid YAML in a metadata file or missing/inconsistent referenced objects.","triggerScenarios":"Running metadata operations (apply/export/diff/inconsistency) with metadata in directory format (`metadata_directory: metadata`) when one of the YAML files fails to parse or references malformed structures during BuildJSONMetadata.","commonSituations":"Hand-editing metadata/tables.yaml with invalid YAML; merge conflicts in metadata files; metadata files referencing dropped sources/tables; tabs or bad indentation in YAML.","solutions":["Run `hasura metadata diff` or a YAML linter over each file in the metadata directory to find the syntax error","Fix indentation (spaces not tabs) and resolve merge conflict markers","If unsure, re-export clean metadata: `hasura metadata export` (or fetch from server) and diff against your files","Keep server and CLI versions aligned so metadata schemas match"],"exampleFix":"# before (metadata/tables.yaml, tab-indented)\ntable:\n\tname: users\n\n# after\ntable:\n  name: users","handlingStrategy":"validation","validationCode":"// Lint all metadata YAML before running metadata commands\nerr := filepath.Walk(metadataDir, func(p string, _ os.FileInfo, err error) error {\n    if err != nil || (!strings.HasSuffix(p, \".yaml\") && !strings.HasSuffix(p, \".yml\")) { return err }\n    b, _ := os.ReadFile(p)\n    var v any\n    if yerr := yaml.Unmarshal(b, &v); yerr != nil { return fmt.Errorf(\"%s: %w\", p, yerr) }\n    return nil\n})","typeGuard":null,"tryCatchPattern":"if r, err := h.Parse(&p); err != nil {\n    if strings.Contains(err.Error(), \"parsing project metadata\") {\n        // run yamllint over metadata/ and fix the flagged file\n    }\n}","preventionTips":["Run yamllint on metadata/ in CI","Resolve merge conflicts in metadata files immediately","Re-export metadata after big schema changes and diff"],"tags":["metadata","yaml","directory-mode","hasura"],"backgroundTag":"metadata-parse-failed","analyzedSha":"724551b9ae87845594ef0408cff0e50eb6c90dc5","analyzedAt":"2026-08-28T07:32:55.105Z","schemaVersion":2},"datasetVersion":"2026-08-28T11:17:15.048Z"}