Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GoのASTを用いて フィルター機能を作ろうとした話

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

GoのASTを用いて フィルター機能を作ろうとした話

Avatar for Suzu Ito

Suzu Ito

April 24, 2025
Tweet

More Decks by Suzu Ito

Other Decks in Programming

Transcript

  1. ླ໦ ହే / Suzuki Taito / @ts__0625 • WebΤϯδχΞ (6೥໨

    • όοΫΤϯυ • Goྺ͸໿Go೥ • ݩʑ͸σʔλΤϯδχΞͬΆ͍ (7೥ • ݱࡏ • WebΤϯδχΞ @גࣜձࣾHRBrain ࣗݾ঺հ
  2. ;ͱʮGoͷASTʯΛࢥ͍ग़ͨ͠ ඪ४ϥΠϒϥϦ go/ast, go/parser GoݴޠͷιʔείʔυΛ੩తղੳ͢Δͱ͖ʹ࢖ΘΕΔ go/ast … AST ද͢ߏ଄ମͳͲ go/parser

    … ιʔείʔυ΍͔ࣜΒASTΛߏங͢Δύʔαʔ go/parser.ParseExpr ؔ਺ … Goݴޠͷࣜ(Expression)͚ͩͷASTΛฦ͢ ( a + fn(1) ) * d
  3. ϑΟϧλʔઃఆ(Goͷࣜ) ࣜͷධՁ݁Ռ͸ඞͣϒʔϧ஋ 3ͭͷؔ਺͕ఆٛͯ͋͠Δ contains(a string) bool : Πϕϯτͷ಺༰͕ a ΛؚΉʁ

    equalType(a string) bool : Πϕϯτͷछྨ͕ a Ͱ͋Δʁ equalLoc(a string) bool : Πϕϯτͷൃੜ৔ॴ͕ a Ͱ͋Δʁ &&ͱ||ͷԋࢉࢠͷΈ͕࢖༻Մೳ ྫ equalLoc(“౦ژ౎৽॓۠”) && equalType(“઄౪ࣄ݅”) || equalLoc(“࡛ۄݝॴ୔ࢢ”) && equalType(“ߑਫ”) && contains(“চ্ਁਫ”) ౦ژ౎৽॓۠ɺ͔ͭɺ઄౪ࣄ݅ ·ͨ͸ ࡛ۄݝॴ୔ࢢɺ͔ͭɺߑਫɺ͔ͭɺʮচ্ਁਫʯؚ͕·ΕΔ
  4. Filter(ev Event, setting string) bool (1) setting(ϑΟϧλʔઃఆ)ͷASTΛ࡞Δ ast/parser.ParseExpr ؔ਺ΛݺͿ͚ͩ equalLoc(“౦ژ౎৽॓۠”)

    && equalType(“઄౪ࣄ݅”) || equalLoc(“࡛ۄݝॴ୔ࢢ”) && equalType(“ߑਫ”) && contains(“চ্ਁਫ”) ্هͷࣜΛASTʹม׵͢Δͱ…΍ͬͯΈΔ https://go.dev/play/p/7llFDi3gdeI
  5. Filter(ev Event, setting string) bool (1) setting(ϑΟϧλʔઃఆ)ͷASTΛ࡞Δ || && equalLoc

    “౦ژ౎৽॓۠” equalType “઄౪ࣄ݅” && && equalLoc “࡛ۄݝॴ୔ࢢ” equalType “ߑਫ” contains “চ্ਁਫ”
  6. Filter(ev Event, setting string) bool (2) ASTʹؚ·ΕΔશͯͷؔ਺ΛධՁ͢Δ ؔ਺͚ͩධՁ (ਂ͞༏ઌ୳ࡧ͠ɺਂ͍ͱ͜Ζʹ͋Δؔ਺͔Β) ||

    && equalLoc “౦ژ౎৽॓۠” equalType “઄౪ࣄ݅” && && equalLoc “࡛ۄݝॴ୔ࢢ” equalType “ߑਫ” contains “চ্ਁਫ”
  7. ͍·ࢥ͏ɺ͍·΍ΔͳΒ ඇΤϯδχΞͰ΋ѻ͑ΔϑΟϧλʔઃఆͱ͸ʁ ΛͪΌΜͱߟ͑Δ with PdMͱσβΠφʔ ධՁࣜ༻ͷϥΠϒϥϦΛ࢖͏ CEL https://cel.dev/ Open Policy

    Agent https://www.openpolicyagent.org/docs/latest/ Expr https://expr-lang.org/ ϥΠϒϥϦͷ໨త͔Β֎Εͨ࢖͍ํΛ͠ͳ͍