(from super.Value, to *super.TypeMap)
| 204 | } |
| 205 | |
| 206 | func (c *cast) toMap(from super.Value, to *super.TypeMap) (super.Value, bool) { |
| 207 | fromType, ok := from.Type().(*super.TypeMap) |
| 208 | if !ok { |
| 209 | return c.error(from, to) |
| 210 | } |
| 211 | keyTypes := map[super.Type]struct{}{} |
| 212 | valTypes := map[super.Type]struct{}{} |
| 213 | var keyVals, valVals []super.Value |
| 214 | aok := true |
| 215 | for it := from.ContainerIter(); !it.Done(); { |
| 216 | keyVal, ok := c.castNext(&it, fromType.KeyType, to.KeyType) |
| 217 | aok = aok && ok |
| 218 | keyVals = append(keyVals, keyVal) |
| 219 | keyTypes[keyVal.Type()] = struct{}{} |
| 220 | valVal, ok := c.castNext(&it, fromType.ValType, to.ValType) |
| 221 | aok = aok && ok |
| 222 | valTypes[valVal.Type()] = struct{}{} |
| 223 | valVals = append(valVals, valVal) |
| 224 | } |
| 225 | if len(keyVals) == 0 { |
| 226 | return super.NewValue(to, from.Bytes()), aok |
| 227 | } |
| 228 | keyType, ok := c.maybeConvertToUnion(keyVals, keyTypes) |
| 229 | aok = aok && ok |
| 230 | valType, ok := c.maybeConvertToUnion(valVals, valTypes) |
| 231 | aok = aok && ok |
| 232 | if keyType != to.KeyType || valType != to.ValType { |
| 233 | to = c.sctx.LookupTypeMap(keyType, valType) |
| 234 | } |
| 235 | var bytes scode.Bytes |
| 236 | for i := range keyVals { |
| 237 | bytes = scode.Append(bytes, keyVals[i].Bytes()) |
| 238 | bytes = scode.Append(bytes, valVals[i].Bytes()) |
| 239 | } |
| 240 | return super.NewValue(to, super.NormalizeMap(bytes)), aok |
| 241 | } |
| 242 | |
| 243 | func (c *cast) toUnion(from super.Value, to *super.TypeUnion) (super.Value, bool) { |
| 244 | tag := bestUnionTag(from.Type(), to) |
no test coverage detected