{"version":3,"file":"extractStructAndGroups.mjs","sources":["../../../../../../src/rendering/renderers/gpu/shader/utils/extractStructAndGroups.ts"],"sourcesContent":["/**\n * Defines the structure of the extracted WGSL structs and groups.\n * @category rendering\n * @advanced\n */\nexport interface StructsAndGroups\n{\n    groups: {\n        group: number;\n        binding: number;\n        name: string;\n        isUniform: boolean;\n        type: string;\n    }[];\n    structs: {\n        name: string;\n        members: Record<string, string>;\n    }[];\n}\n\n/**\n * @param wgsl\n * @internal\n */\nexport function extractStructAndGroups(wgsl: string): StructsAndGroups\n{\n    // Patterns for parsing the WGSL file\n    const linePattern = /(^|[^/])@(group|binding)\\(\\d+\\)[^;]+;/g;\n    const groupPattern = /@group\\((\\d+)\\)/;\n    const bindingPattern = /@binding\\((\\d+)\\)/;\n    const namePattern = /var(<[^>]+>)? (\\w+)/;\n    const typePattern = /:\\s*([\\w<>]+)/;\n    const structPattern = /struct\\s+(\\w+)\\s*{([^}]+)}/g;\n    const structMemberPattern = /(\\w+)\\s*:\\s*([\\w\\<\\>]+)/g;\n    const structName = /struct\\s+(\\w+)/;\n\n    // Find the @group and @binding annotations\n    const groups = wgsl.match(linePattern)?.map((item) => ({\n        group: parseInt(item.match(groupPattern)[1], 10),\n        binding: parseInt(item.match(bindingPattern)[1], 10),\n        name: item.match(namePattern)[2],\n        isUniform: item.match(namePattern)[1] === '<uniform>',\n        type: item.match(typePattern)[1],\n    }));\n\n    if (!groups)\n    {\n        return {\n            groups: [],\n            structs: [],\n        };\n    }\n\n    // Find the structs\n    const structs = wgsl\n        .match(structPattern)\n        ?.map((struct) =>\n        {\n            const name = struct.match(structName)[1];\n            const members = struct.match(structMemberPattern).reduce((acc: Record<string, string>, member) =>\n            {\n                const [name, type] = member.split(':');\n\n                acc[name.trim()] = type.trim();\n\n                return acc;\n            }, {});\n\n            if (!members)\n            {\n                return null;\n            }\n\n            return { name, members };\n            // Only include the structs mentioned in the @group/@binding annotations\n        })\n        .filter(({ name }) => groups.some((group) =>\n\n            // Handle both direct type matches and generic types like array<StructName>\n            group.type === name || group.type.includes(`<${name}>`)\n        )) ?? [];\n\n    return {\n        groups,\n        structs,\n    };\n}\n"],"names":["name"],"mappings":";AAwBO,SAAS,uBAAuB,IAAA,EACvC;AAEI,EAAA,MAAM,WAAA,GAAc,wCAAA;AACpB,EAAA,MAAM,YAAA,GAAe,iBAAA;AACrB,EAAA,MAAM,cAAA,GAAiB,mBAAA;AACvB,EAAA,MAAM,WAAA,GAAc,qBAAA;AACpB,EAAA,MAAM,WAAA,GAAc,eAAA;AACpB,EAAA,MAAM,aAAA,GAAgB,6BAAA;AACtB,EAAA,MAAM,mBAAA,GAAsB,0BAAA;AAC5B,EAAA,MAAM,UAAA,GAAa,gBAAA;AAGnB,EAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA,EAAG,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,IACnD,KAAA,EAAO,SAAS,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA,CAAE,CAAC,GAAG,EAAE,CAAA;AAAA,IAC/C,OAAA,EAAS,SAAS,IAAA,CAAK,KAAA,CAAM,cAAc,CAAA,CAAE,CAAC,GAAG,EAAE,CAAA;AAAA,IACnD,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,WAAW,EAAE,CAAC,CAAA;AAAA,IAC/B,WAAW,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA,CAAE,CAAC,CAAA,KAAM,WAAA;AAAA,IAC1C,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,WAAW,EAAE,CAAC;AAAA,GACnC,CAAE,CAAA;AAEF,EAAA,IAAI,CAAC,MAAA,EACL;AACI,IAAA,OAAO;AAAA,MACH,QAAQ,EAAC;AAAA,MACT,SAAS;AAAC,KACd;AAAA,EACJ;AAGA,EAAA,MAAM,UAAU,IAAA,CACX,KAAA,CAAM,aAAa,CAAA,EAClB,GAAA,CAAI,CAAC,MAAA,KACP;AACI,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,UAAU,EAAE,CAAC,CAAA;AACvC,IAAA,MAAM,OAAA,GAAU,OAAO,KAAA,CAAM,mBAAmB,EAAE,MAAA,CAAO,CAAC,KAA6B,MAAA,KACvF;AACI,MAAA,MAAM,CAACA,KAAAA,EAAM,IAAI,CAAA,GAAI,MAAA,CAAO,MAAM,GAAG,CAAA;AAErC,MAAA,GAAA,CAAIA,KAAAA,CAAK,IAAA,EAAM,CAAA,GAAI,KAAK,IAAA,EAAK;AAE7B,MAAA,OAAO,GAAA;AAAA,IACX,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,IAAI,CAAC,OAAA,EACL;AACI,MAAA,OAAO,IAAA;AAAA,IACX;AAEA,IAAA,OAAO,EAAE,MAAM,OAAA,EAAQ;AAAA,EAE3B,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,EAAE,IAAA,OAAW,MAAA,CAAO,IAAA;AAAA,IAAK,CAAC,KAAA;AAAA;AAAA,MAG/B,KAAA,CAAM,SAAS,IAAA,IAAQ,KAAA,CAAM,KAAK,QAAA,CAAS,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAG;AAAA;AAAA,GACzD,KAAK,EAAC;AAEX,EAAA,OAAO;AAAA,IACH,MAAA;AAAA,IACA;AAAA,GACJ;AACJ;;;;"}