// Copyright 2024 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package filedesc

import (
	

	
	
	
	
)

var defaultsCache = make(map[Edition]EditionFeatures)
var defaultsKeys = []Edition{}

func () {
	unmarshalEditionDefaults(editiondefaults.Defaults)
	SurrogateProto2.L1.EditionFeatures = getFeaturesFor(EditionProto2)
	SurrogateProto3.L1.EditionFeatures = getFeaturesFor(EditionProto3)
	SurrogateEdition2023.L1.EditionFeatures = getFeaturesFor(Edition2023)
}

func ( []byte,  EditionFeatures) EditionFeatures {
	for len() > 0 {
		, ,  := protowire.ConsumeTag()
		 = [:]
		switch  {
		case genid.GoFeatures_LegacyUnmarshalJsonEnum_field_number:
			,  := protowire.ConsumeVarint()
			 = [:]
			.GenerateLegacyUnmarshalJSON = protowire.DecodeBool()
		case genid.GoFeatures_ApiLevel_field_number:
			,  := protowire.ConsumeVarint()
			 = [:]
			.APILevel = int()
		case genid.GoFeatures_StripEnumPrefix_field_number:
			,  := protowire.ConsumeVarint()
			 = [:]
			.StripEnumPrefix = int()
		default:
			panic(fmt.Sprintf("unkown field number %d while unmarshalling GoFeatures", ))
		}
	}
	return 
}

func ( []byte,  EditionFeatures) EditionFeatures {
	for len() > 0 {
		, ,  := protowire.ConsumeTag()
		 = [:]
		switch  {
		case protowire.VarintType:
			,  := protowire.ConsumeVarint()
			 = [:]
			switch  {
			case genid.FeatureSet_FieldPresence_field_number:
				.IsFieldPresence =  == genid.FeatureSet_EXPLICIT_enum_value ||  == genid.FeatureSet_LEGACY_REQUIRED_enum_value
				.IsLegacyRequired =  == genid.FeatureSet_LEGACY_REQUIRED_enum_value
			case genid.FeatureSet_EnumType_field_number:
				.IsOpenEnum =  == genid.FeatureSet_OPEN_enum_value
			case genid.FeatureSet_RepeatedFieldEncoding_field_number:
				.IsPacked =  == genid.FeatureSet_PACKED_enum_value
			case genid.FeatureSet_Utf8Validation_field_number:
				.IsUTF8Validated =  == genid.FeatureSet_VERIFY_enum_value
			case genid.FeatureSet_MessageEncoding_field_number:
				.IsDelimitedEncoded =  == genid.FeatureSet_DELIMITED_enum_value
			case genid.FeatureSet_JsonFormat_field_number:
				.IsJSONCompliant =  == genid.FeatureSet_ALLOW_enum_value
			case genid.FeatureSet_EnforceNamingStyle_field_number:
				// EnforceNamingStyle is enforced in protoc, languages other than C++
				// are not supposed to do anything with this feature.
			default:
				panic(fmt.Sprintf("unkown field number %d while unmarshalling FeatureSet", ))
			}
		case protowire.BytesType:
			,  := protowire.ConsumeBytes()
			 = [:]
			switch  {
			case genid.FeatureSet_Go_ext_number:
				 = unmarshalGoFeature(, )
			}
		}
	}

	return 
}

func ( protoreflect.Descriptor) EditionFeatures {
	var  EditionFeatures
	switch p := .(type) {
	case *File:
		 = .L1.EditionFeatures
	case *Message:
		 = .L1.EditionFeatures
	default:
		panic(fmt.Sprintf("unknown parent type %T", ))
	}
	return 
}

func ( []byte) {
	var  Edition
	var  EditionFeatures
	for len() > 0 {
		, ,  := protowire.ConsumeTag()
		 = [:]
		switch  {
		case protowire.VarintType:
			,  := protowire.ConsumeVarint()
			 = [:]
			switch  {
			case genid.FeatureSetDefaults_FeatureSetEditionDefault_Edition_field_number:
				 = Edition()
			}
		case protowire.BytesType:
			,  := protowire.ConsumeBytes()
			 = [:]
			switch  {
			case genid.FeatureSetDefaults_FeatureSetEditionDefault_FixedFeatures_field_number:
				 = unmarshalFeatureSet(, )
			case genid.FeatureSetDefaults_FeatureSetEditionDefault_OverridableFeatures_field_number:
				 = unmarshalFeatureSet(, )
			}
		}
	}
	defaultsCache[] = 
	defaultsKeys = append(defaultsKeys, )
}

func ( []byte) {
	for len() > 0 {
		, ,  := protowire.ConsumeTag()
		 = [:]
		switch  {
		case genid.FeatureSetDefaults_Defaults_field_number:
			,  := protowire.ConsumeBytes()
			 = [:]
			unmarshalEditionDefault()
		case genid.FeatureSetDefaults_MinimumEdition_field_number,
			genid.FeatureSetDefaults_MaximumEdition_field_number:
			// We don't care about the minimum and maximum editions. If the
			// edition we are looking for later on is not in the cache we know
			// it is outside of the range between minimum and maximum edition.
			,  := protowire.ConsumeVarint()
			 = [:]
		default:
			panic(fmt.Sprintf("unkown field number %d while unmarshalling EditionDefault", ))
		}
	}
}

func ( Edition) EditionFeatures {
	 := EditionUnknown
	for ,  := range defaultsKeys {
		if  >  {
			break
		}
		 = 
	}
	if  == EditionUnknown {
		panic(fmt.Sprintf("unsupported edition: %v", ))
	}
	return defaultsCache[]
}