package binary

import (
	
	
	

	
	
	
)

// dataSegmentPrefix represents three types of data segments.
//
// https://www.w3.org/TR/2022/WD-wasm-core-2-20220419/binary/modules.html#data-section
type dataSegmentPrefix = uint32

const (
	// dataSegmentPrefixActive is the prefix for the version 1.0 compatible data segment, which is classified as "active" in 2.0.
	dataSegmentPrefixActive dataSegmentPrefix = 0x0
	// dataSegmentPrefixPassive prefixes the "passive" data segment as in version 2.0 specification.
	dataSegmentPrefixPassive dataSegmentPrefix = 0x1
	// dataSegmentPrefixActiveWithMemoryIndex is the active prefix with memory index encoded which is defined for futur use as of 2.0.
	dataSegmentPrefixActiveWithMemoryIndex dataSegmentPrefix = 0x2
)

func decodeDataSegment( *bytes.Reader,  api.CoreFeatures,  *wasm.DataSegment) ( error) {
	, ,  := leb128.DecodeUint32()
	if  != nil {
		 = fmt.Errorf("read data segment prefix: %w", )
		return
	}

	if  != dataSegmentPrefixActive {
		if  = .RequireEnabled(api.CoreFeatureBulkMemoryOperations);  != nil {
			 = fmt.Errorf("non-zero prefix for data segment is invalid as %w", )
			return
		}
	}

	switch  {
	case dataSegmentPrefixActive,
		dataSegmentPrefixActiveWithMemoryIndex:
		// Active data segment as in
		// https://www.w3.org/TR/2022/WD-wasm-core-2-20220419/binary/modules.html#data-section
		if  == 0x2 {
			, ,  := leb128.DecodeUint32()
			if  != nil {
				return fmt.Errorf("read memory index: %v", )
			} else if  != 0 {
				return fmt.Errorf("memory index must be zero but was %d", )
			}
		}

		 = decodeConstantExpression(, , &.OffsetExpression)
		if  != nil {
			return fmt.Errorf("read offset expression: %v", )
		}
	case dataSegmentPrefixPassive:
		// Passive data segment doesn't need const expr nor memory index encoded.
		// https://www.w3.org/TR/2022/WD-wasm-core-2-20220419/binary/modules.html#data-section
		.Passive = true
	default:
		 = fmt.Errorf("invalid data segment prefix: 0x%x", )
		return
	}

	, ,  := leb128.DecodeUint32()
	if  != nil {
		 = fmt.Errorf("get the size of vector: %v", )
		return
	}

	.Init = make([]byte, )
	if _,  = io.ReadFull(, .Init);  != nil {
		 = fmt.Errorf("read bytes for init: %v", )
	}
	return
}