// ĠCopyright Ġ 2 0 2 1 ĠSt rix py rr Ċ // Ċ // ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ // Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ // ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ // Ċ // ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ // Ċ // ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ // Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ // ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ // ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ // Ġlimitations Ġunder Ġthe ĠLicense . Ċ package Ġst rix py rr . launch pad . metadata . fabric Ċ Ċ import Ġkotlinx . serialization . Experimental Serialization Api Ċ import Ġkotlinx . serialization . Serialization Exception Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġok io . buffer Ċ import Ġok io . sink Ċ import Ġok io . source Ċ import Ġorg . gradle . api . Default Task Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . api . tasks . OutputFile Ċ import Ġorg . gradle . api . tasks . Source Set Ċ import Ġorg . gradle . api . tasks . Source Set Container Ċ import Ġorg . gradle . api . tasks . Task Action Ċ import Ġorg . gradle . kotlin . dsl . get Ċ import Ġorg . gradle . kotlin . dsl . get ByName Ċ import Ġorg . gradle . language . jvm . tasks . Process Resources Ċ import Ġjava . io . File Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . Standard Open Option . CREATE Ċ import Ġjava . nio . file . Standard Open Option . TRUNC ATE _ EXIST ING Ċ import Ġjavax . inject . Inject Ċ import Ġkotlin . io . path .* Ċ Ċ @ Opt In ( Experimental Path Api :: class , ĠExperimental Serialization Api :: class ) Ċ open Ġclass ĠGenerate Fabric Mod Metadata Task (@ get : OutputFile Ġval Ġoutput : ĠPath ) Ġ: ĠDefault Task () Ċ { Ċ ĉ @ Inject Ġconstructor ( project : ĠProject ) Ġ: Ġthis ( project , Ġproject . main Source Set ) Ċ ĉ constructor ( project : ĠProject , Ġsource Set : ĠSource Set ) Ġ: Ċĉ ĉ this ( project . build Dir Ġ/ Ġ" generated - sources " Ġ/ Ġ" fabric - mod - metadata " Ġ/ Ġ" fabric . mod . json ") Ċ ĉ { Ċĉ ĉ val Ġgenerated Ġ= Ġoutput . parent ĊĉĉĊĉ ĉ source Set . resources . src Dir ( generated ) ĊĉĉĊĉ ĉ // ĠGenerate Ġthe Ġmetadata Ġbefore Ġresources Ġare Ġprocessed . Ċĉ ĉ @ Suppress (" Un stable Api Usage ") Ċĉ ĉ project . tasks . named ( Ċĉĉ ĉ source Set . process Resources Task Name , Ċĉĉ ĉ Process Resources :: class . java Ċĉ ĉ ) Ċĉ ĉ { Ċĉĉ ĉ it . depends On ( this ) Ċĉ ĉ } ĊĉĉĊ ĉ } ĊĉĊ ĉ late init Ġvar Ġmetadata : ĠFabric Mod ĊĉĊ ĉ var Ġproduce Human Readable Output Ġ= Ġfalse ĊĉĊ ĉ init Ċ ĉ { Ċĉ ĉ outputs . up ToDate When Ġ{ Ġis Not Current Ġ} Ċ ĉ } ĊĉĊ ĉ @ Task Action Ċ ĉ fun Ġgenerate () Ċ ĉ { Ċĉ ĉ did Work Ġ= Ġtrue ĊĉĉĊĉ ĉ if Ġ(! :: metadata . isInitialized ) Ċĉ ĉ { Ċĉĉ ĉ output . delete Existing () ĊĉĉĉĊĉĉ ĉ return Ċĉ ĉ } ĊĉĉĊĉ ĉ output . parent . run Ġ{ Ġif Ġ( not Exists ()) Ġcreate Directory () Ġ} ĊĉĉĊĉ ĉ output . sink ( CREATE , ĠTR UNC ATE _ EXIST ING ) ĊĉĉĉĠ Ġ. buffer () ĊĉĉĉĠ Ġ. use () ĊĉĉĉĠ Ġ{ Ġsink Ġ-> ĊĉĉĉĉĠ Ġmetadata . encode ( ĊĉĉĉĉĉĠ Ġsink , ĊĉĉĉĉĉĠ ĠJson () ĊĉĉĉĉĉĠ Ġ{ ĊĉĉĉĉĉĉĠ Ġpretty Print Ġ= Ġproduce Human Readable Output ĊĉĉĉĉĉĉĠĠ ĊĉĉĉĉĉĉĠ Ġif Ġ(! produce Human Readable Output ) Ġpretty Print Indent Ġ= Ġ"\ t " ĊĉĉĉĉĉĉĠĠ ĊĉĉĉĉĉĉĠ Ġencode Defaults Ġ= Ġfalse Ġ// ĠHere Ġfor Ġcl arity . ĊĉĉĉĉĉĠ Ġ} ĊĉĉĉĉĠ Ġ) ĊĉĉĉĠ Ġ} Ċ ĉ } ĊĉĊ ĉ @ get :[ Jvm Synt hetic ĠJ vm Name (" isNot Current ")] Ċ ĉ internal Ġval Ġis Not Current : ĠBoolean Ġget () Ċ ĉ { Ċĉ ĉ val Ġoutput Ġ= Ġoutput ĊĉĉĊĉ ĉ if Ġ( output . exists ()) Ċĉ ĉ { Ċĉĉ ĉ if Ġ(! :: metadata . isInitialized ) Ċĉĉĉ ĉ return Ġtrue ĊĉĉĉĊĉĉ ĉ return Ġtry Ċĉĉ ĉ { Ċĉĉĉ ĉ val Ġexisting Ġ= Ċĉĉĉĉ ĉ Fabric Mod . decode ( Ċĉĉĉĉĉ ĉ source Ġ= Ġoutput . source (). buffer () Ċĉĉĉĉ ĉ ) ĊĉĉĉĉĊĉĉĉ ĉ metadata Ġ!= Ġexisting Ċĉĉ ĉ } Ċĉĉ ĉ catch Ġ(_ : ĠSerialization Exception ) Ċĉĉ ĉ { Ċĉĉĉ ĉ true Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ else Ċĉ ĉ { Ċĉĉ ĉ if Ġ(! :: metadata . isInitialized ) Ċĉĉĉ ĉ return Ġfalse ĊĉĉĉĊĉĉ ĉ return Ġtrue Ċĉ ĉ } Ċ ĉ } ĊĉĊ ĉ comp anion Ġobject Ċ ĉ { Ċĉ ĉ private Ġval ĠProject . main Source Set Ġget () Ġ= Ċĉĉ ĉ extensions . get ByName < Source Set Container >(" source Sets ") [" main "] ĊĉĉĊĉ ĉ private Ġoperator Ġfun ĠFile . div ( value : ĠString ) Ġ= Ġto Path () Ġ/ Ġvalue Ċ ĉ } Ċ }