union bug fix

This commit is contained in:
Drew Ansbacher
2021-08-18 15:17:17 -06:00
committed by Aiden McClelland
parent 3ee06a556e
commit 9d612a51fc

View File

@@ -1,6 +1,6 @@
import { Injectable } from '@angular/core' import { Injectable } from '@angular/core'
import { AbstractControl, FormArray, FormBuilder, FormControl, FormGroup, ValidationErrors, ValidatorFn, Validators } from '@angular/forms' import { AbstractControl, FormArray, FormBuilder, FormControl, FormGroup, ValidationErrors, ValidatorFn, Validators } from '@angular/forms'
import { ConfigSpec, isValueSpecListOf, ListValueSpecNumber, ListValueSpecObject, ListValueSpecString, ListValueSpecUnion, UniqueBy, ValueSpec, ValueSpecEnum, ValueSpecList, ValueSpecNumber, ValueSpecString, ValueSpecUnion } from '../pkg-config/config-types' import { ConfigSpec, isValueSpecListOf, ListValueSpecNumber, ListValueSpecObject, ListValueSpecString, ListValueSpecUnion, UniqueBy, ValueSpec, ValueSpecEnum, ValueSpecList, ValueSpecNumber, ValueSpecObject, ValueSpecString, ValueSpecUnion } from '../pkg-config/config-types'
import { getDefaultString, Range } from '../pkg-config/config-utilities' import { getDefaultString, Range } from '../pkg-config/config-utilities'
@Injectable({ @Injectable({
@@ -201,8 +201,9 @@ function listItemEquals (spec: ValueSpecList, val1: any, val2: any): boolean {
case 'enum': case 'enum':
return val1 == val2 return val1 == val2
case 'object': case 'object':
case 'union':
return listObjEquals(spec.spec['unique-by'], (spec.spec as ListValueSpecObject), val1, val2) return listObjEquals(spec.spec['unique-by'], (spec.spec as ListValueSpecObject), val1, val2)
case 'union':
return unionEquals(spec.spec['unique-by'], spec.spec as ListValueSpecUnion, val1, val2)
default: default:
return false return false
} }
@@ -216,8 +217,9 @@ function itemEquals (spec: ValueSpec, val1: any, val2: any): boolean {
case 'enum': case 'enum':
return val1 == val2 return val1 == val2
case 'object': case 'object':
return objEquals(spec['unique-by'], (spec as ValueSpecObject), val1, val2)
case 'union': case 'union':
return objEquals(spec['unique-by'], (spec as ValueSpec), val1, val2) return unionEquals(spec['unique-by'], (spec as ValueSpecUnion), val1, val2)
case 'list': case 'list':
if (val1.length !== val2.length) { if (val1.length !== val2.length) {
return false return false
@@ -237,7 +239,8 @@ function listObjEquals (uniqueBy: UniqueBy, spec: ListValueSpecObject, val1: any
if (uniqueBy === null) { if (uniqueBy === null) {
return false return false
} else if (typeof uniqueBy === 'string') { } else if (typeof uniqueBy === 'string') {
return itemEquals(spec.spec[uniqueBy], val1[uniqueBy], val2[uniqueBy]) const item = itemEquals(spec.spec[uniqueBy], val1[uniqueBy], val2[uniqueBy])
return item
} else if ('any' in uniqueBy) { } else if ('any' in uniqueBy) {
for (let subSpec of uniqueBy.any) { for (let subSpec of uniqueBy.any) {
if (listObjEquals(subSpec, spec, val1, val2)) { if (listObjEquals(subSpec, spec, val1, val2)) {
@@ -255,11 +258,11 @@ function listObjEquals (uniqueBy: UniqueBy, spec: ListValueSpecObject, val1: any
} }
} }
function objEquals (uniqueBy: UniqueBy, spec: ValueSpec, val1: any, val2: any): boolean { function objEquals (uniqueBy: UniqueBy, spec: ValueSpecObject, val1: any, val2: any): boolean {
if (uniqueBy === null) { if (uniqueBy === null) {
return false return false
} else if (typeof uniqueBy === 'string') { } else if (typeof uniqueBy === 'string') {
return itemEquals(spec, val1, val2) return itemEquals(spec[uniqueBy], val1[uniqueBy], val2[uniqueBy])
} else if ('any' in uniqueBy) { } else if ('any' in uniqueBy) {
for (let subSpec of uniqueBy.any) { for (let subSpec of uniqueBy.any) {
if (objEquals(subSpec, spec, val1, val2)) { if (objEquals(subSpec, spec, val1, val2)) {
@@ -275,4 +278,32 @@ function objEquals (uniqueBy: UniqueBy, spec: ValueSpec, val1: any, val2: any):
} }
return true return true
} }
}
function unionEquals (uniqueBy: UniqueBy, spec: ValueSpecUnion | ListValueSpecUnion, val1: any, val2: any): boolean {
const tagId = spec.tag.id
const variant = spec.variants[val1[tagId]]
if (uniqueBy === null) {
return false
} else if (typeof uniqueBy === 'string') {
if (uniqueBy === tagId) {
return val1[tagId] === val2[tagId]
} else {
return itemEquals(variant[uniqueBy], val1[uniqueBy], val2[uniqueBy])
}
} else if ('any' in uniqueBy) {
for (let subSpec of uniqueBy.any) {
if (unionEquals(subSpec, spec, val1, val2)) {
return true
}
}
return false
} else if ('all' in uniqueBy) {
for (let subSpec of uniqueBy.all) {
if (!unionEquals(subSpec, spec, val1, val2)) {
return false
}
}
return true
}
} }