Kužim što pričaš, imam to rješeno pošto postoji mogućnost registracije custom single typeova.
Recimo, bez registracije custom typova da moramo validirati objekt koji je garaža…koji je array auta, to bi bilo:
//valiator za garažu:
"array<object[brojVrata:int, vozac:objekt, volan:string[left|right]]>"
//Znači samo auto nam je:
"object[brojVrata:int, vozac:objekt, volan:string[left|right]]"
//I sada ako imamo objekt koji ima više garaža morali bi pisati:
"object[
garaza1:array<object[brojVrata:int, vozac:objekt, volan:string[left|right]]>
garaza2:array<object[brojVrata:int, vozac:objekt, volan:string[left|right]]>
]"
//što je glupo, jer želimo pisati:
"object[
garaza1:array<auto>
garaza2:array<auto>
]"
//ili još bolje, želimo pisati:
"object[
garaza1:garaza,
garaza2:garaza
]"
// Pa se to postiže vrlo jednostavno i po već poznatom principu deklaracija klasa. Tako da sintaksa koja će istovremeno deklarirati klasu i koristiti je za validaciju izgleda:
"
@auto:object[brojVrata:int, vozac:objekt, volan:string[left|right]]
@garaza:array<auto>
object[
garaza1:garaza,
garaza2:garaza
]"
// ..i sada ako kontroliramo strukturu nekog objekta sa gornjom validacijom, onda prolazi samo za objekt koji na ključu garaza1 ima garazu, te na ključu garaza2 ima garažu.
// I to je točno ovo što ti pričaš, samo u tvom slučaju imamo nešto tipa:
"
@myPassword: string{20-30}
object[pass:myPassword, key2:..., key3:...]"
I na ovaj način pisano, to su lokalne deklaracije klasa. Dok postoje i globalne, koje se mogu registrirati putem metode za registraciju novog singleType-a.
I kao što sam dao u uvodnom primjeru, registracija novog tipa se ne mora slagati samo iz komibnacije postojećih tipova, nego se pomoću funkcije može customizirat da bude bilo što. Primjer:
ADDING CUSTOM TYPES
addCustomControlType("strlen4", function(x){return isString(x) && x.length==4});
array<strlen4> -> za ulaz ["abcd", "efgh"] -> vraća true
Meni se uglavnom čini vrlo koristan alatić.
Inspired by C#, hehe.
…a i bit će još toga, uvest ću relaciju “this”, tako da se može raditi komparacija na razini objekta, nešto tipa:
objekt[key1:string, key2:array{this.key1.length}]
isto tako i relaciju “this.parent”, kako bi se mogla raditi komparacija na različitim razinama objekta.
Recimo u gornjem primjeru sa autom i garažom, da se može postaviti uvjet da auto ispunjava nešto što garaža zahtjeva da ispunjava svaki auto koji joj pripada.