123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129(* SPDX-License-Identifier: MIT *)typeuser_defined_license=Types.user_defined_license={document_ref:stringoption;license_ref:string;}typesimple_license=Types.simple_license=|LicenseIDofstring|LicenseIDPlusofstring|LicenseRefofuser_defined_licensetypeuser_defined_addition=Types.user_defined_addition={document_ref:stringoption;addition_ref:string;}typeaddition=Types.addition=|Exceptionofstring|AdditionRefofuser_defined_additiontypet=Types.t=|Simpleofsimple_license|WITHofsimple_license*addition|ANDoft*t|ORoft*ttypeerror=[|`InvalidLicenseIDofstring|`InvalidExceptionIDofstring|`ParseError]let(>>=)=Result.bindlet(>|=)xf=Result.mapfxletvalid_license_ids=LicenseIDs.listletvalid_exception_ids=ExceptionIDs.listletuppercased_valid_license_ids=List.map(funx->(x,String.uppercase_asciix))valid_license_idsletuppercased_valid_exception_ids=List.map(funx->(x,String.uppercase_asciix))valid_exception_idsletnormalize_license_idid=leteq=String.equal(String.uppercase_asciiid)inmatchList.find(fun(_,up)->equp)uppercased_valid_license_idswith|(x,_)->Okx|exceptionNot_found->Error(`InvalidLicenseIDid)letnormalize_exception_idid=leteq=String.equal(String.uppercase_asciiid)inmatchList.find(fun(_,up)->equp)uppercased_valid_exception_idswith|(x,_)->Okx|exceptionNot_found->Error(`InvalidExceptionIDid)letnormalize_simple=function|LicenseIDid->normalize_license_idid>|=funid->LicenseIDid|LicenseIDPlusid->normalize_license_idid>|=funid->LicenseIDPlusid|LicenseRef_asx->Okxletnormalize_addition=function|Exceptionexc->normalize_exception_idexc>|=funexc->Exceptionexc|AdditionRef_asx->Okxletrecnormalize=function|Simplelicense->normalize_simplelicense>|=funlicense->Simplelicense|WITH(simple,addition)->normalize_simplesimple>>=funsimple->normalize_additionaddition>|=funaddition->WITH(simple,addition)|AND(x,y)->normalizex>>=funx->normalizey>|=funy->AND(x,y)|OR(x,y)->normalizex>>=funx->normalizey>|=funy->OR(x,y)letparses=letlexbuf=Lexing.from_stringsinmatchParser.mainLexer.mainlexbufwith|license->normalizelicense|exception(Lexer.Error|Parsing.Parse_error)->Error`ParseErrorletuser_defined_license_to_string=function|{document_ref=None;license_ref}->"LicenseRef-"^license_ref|{document_ref=Somedocument_ref;license_ref}->"DocumentRef-"^document_ref^":"^"LicenseRef-"^license_refletsimple_to_string=function|LicenseIDx->x|LicenseIDPlusx->x^"+"|LicenseRefuser_def->user_defined_license_to_stringuser_defletuser_defined_addition_to_string=function|{document_ref=None;addition_ref}->"AdditionRef-"^addition_ref|{document_ref=Somedocument_ref;addition_ref}->"DocumentRef-"^document_ref^":"^"AdditionRef-"^addition_refletaddition_to_string=function|Exceptionx->x|AdditionRefuser_def->user_defined_addition_to_stringuser_defletto_string=letrecaux~prev=function|Simplex->simple_to_stringx|WITH(x,addition)->simple_to_stringx^" WITH "^addition_to_stringaddition|AND(x,y)->lets=aux~prev:`ANDx^" AND "^aux~prev:`ANDyinbeginmatchprevwith|(`None|`AND)->s|`OR->"("^s^")"end|OR(x,y)->lets=aux~prev:`ORx^" OR "^aux~prev:`ORyinbeginmatchprevwith|(`None|`OR)->s|`AND->"("^s^")"endinaux~prev:`None