code: func verifyTaskMetadata(taskMetadataRawMsg json.RawMessage) error {
  	taskMetadataMap := make(map[string]json.RawMessage)
  	json.Unmarshal(taskMetadataRawMsg, &taskMetadataMap)
  
  	if taskMetadataMap["Arn"] == nil {
  		return notEmptyErrMsg("Arn")
  	}
  
  	if taskMetadataMap["DesiredStatus"] == nil {
  		return notEmptyErrMsg("DesiredStatus")
  	}
  
  	if taskMetadataMap["KnownStatus"] == nil {
  		return notEmptyErrMsg("KnownStatus")
  	}
  
  	if taskMetadataMap["Family"] == nil {
  		return notEmptyErrMsg("Family")
  	}
  
  	if taskMetadataMap["Version"] == nil {
  		return notEmptyErrMsg("Version")
  	}
  
  	if taskMetadataMap["Containers"] == nil {
  		return notEmptyErrMsg("Containers")
  	}
  
  	var containersMetadataArray []json.RawMessage
  	json.Unmarshal(taskMetadataMap["Containers"], &containersMetadataArray)
  	if len(containersMetadataArray) != 1 {
  		return fmt.Errorf("incorrect number of containers, expected 1, received %d",
  			len(containersMetadataArray))
  	}
  
  	return verifyContainerMetadata(containersMetadataArray[0])
  }
docs: // verifyTaskMetadata verifies the number of containers in task metadata, make
  // sure each necessary field is not empty, we cannot check the values of those fields
  // since they are dynamic. It also verifies the container metadata.