@ipld/car
Version:
Content Addressable aRchive format reader and writer
215 lines (211 loc) • 7.11 kB
JavaScript
/** Auto-generated with @ipld/schema@v4.2.0 at Thu Sep 14 2023 from IPLD Schema:
*
* # CarV1HeaderOrV2Pragma is a more relaxed form, and can parse {version:x} where
* # roots are optional. This is typically useful for the {verison:2} CARv2
* # pragma.
*
* type CarV1HeaderOrV2Pragma struct {
* roots optional [&Any]
* # roots is _not_ optional for CarV1 but we defer that check within code to
* # gracefully handle the V2 case where it's just {version:X}
* version Int
* }
*
* # CarV1Header is the strict form of the header, and requires roots to be
* # present. This is compatible with the CARv1 specification.
*
* # type CarV1Header struct {
* # roots [&Any]
* # version Int
* # }
*
*/
const Kinds = {
Null: /** @returns {undefined|null} */ (/** @type {any} */ obj) => obj === null ? obj : undefined,
Int: /** @returns {undefined|number} */ (/** @type {any} */ obj) => Number.isInteger(obj) ? obj : undefined,
Float: /** @returns {undefined|number} */ (/** @type {any} */ obj) => typeof obj === 'number' && Number.isFinite(obj) ? obj : undefined,
String: /** @returns {undefined|string} */ (/** @type {any} */ obj) => typeof obj === 'string' ? obj : undefined,
Bool: /** @returns {undefined|boolean} */ (/** @type {any} */ obj) => typeof obj === 'boolean' ? obj : undefined,
Bytes: /** @returns {undefined|Uint8Array} */ (/** @type {any} */ obj) => obj instanceof Uint8Array ? obj : undefined,
Link: /** @returns {undefined|object} */ (/** @type {any} */ obj) => obj !== null && typeof obj === 'object' && obj.asCID === obj ? obj : undefined,
List: /** @returns {undefined|Array<any>} */ (/** @type {any} */ obj) => Array.isArray(obj) ? obj : undefined,
Map: /** @returns {undefined|object} */ (/** @type {any} */ obj) => obj !== null && typeof obj === 'object' && obj.asCID !== obj && !Array.isArray(obj) && !(obj instanceof Uint8Array) ? obj : undefined
}
/** @type {{ [k in string]: (obj:any)=>undefined|any}} */
const Types = {
'CarV1HeaderOrV2Pragma > roots (anon) > valueType (anon)': Kinds.Link,
'CarV1HeaderOrV2Pragma > roots (anon)': /** @returns {undefined|any} */ (/** @type {any} */ obj) => {
if (Kinds.List(obj) === undefined) {
return undefined
}
for (let i = 0; i < obj.length; i++) {
let v = obj[i]
v = Types['CarV1HeaderOrV2Pragma > roots (anon) > valueType (anon)'](v)
if (v === undefined) {
return undefined
}
if (v !== obj[i]) {
const ret = obj.slice(0, i)
for (let j = i; j < obj.length; j++) {
let v = obj[j]
v = Types['CarV1HeaderOrV2Pragma > roots (anon) > valueType (anon)'](v)
if (v === undefined) {
return undefined
}
ret.push(v)
}
return ret
}
}
return obj
},
Int: Kinds.Int,
CarV1HeaderOrV2Pragma: /** @returns {undefined|any} */ (/** @type {any} */ obj) => {
if (Kinds.Map(obj) === undefined) {
return undefined
}
const entries = Object.entries(obj)
/** @type {{[k in string]: any}} */
let ret = obj
let requiredCount = 1
for (let i = 0; i < entries.length; i++) {
const [key, value] = entries[i]
switch (key) {
case 'roots':
{
const v = Types['CarV1HeaderOrV2Pragma > roots (anon)'](obj[key])
if (v === undefined) {
return undefined
}
if (v !== value || ret !== obj) {
if (ret === obj) {
/** @type {{[k in string]: any}} */
ret = {}
for (let j = 0; j < i; j++) {
ret[entries[j][0]] = entries[j][1]
}
}
ret.roots = v
}
}
break
case 'version':
{
requiredCount--
const v = Types.Int(obj[key])
if (v === undefined) {
return undefined
}
if (v !== value || ret !== obj) {
if (ret === obj) {
/** @type {{[k in string]: any}} */
ret = {}
for (let j = 0; j < i; j++) {
ret[entries[j][0]] = entries[j][1]
}
}
ret.version = v
}
}
break
default:
return undefined
}
}
if (requiredCount > 0) {
return undefined
}
return ret
}
}
/** @type {{ [k in string]: (obj:any)=>undefined|any}} */
const Reprs = {
'CarV1HeaderOrV2Pragma > roots (anon) > valueType (anon)': Kinds.Link,
'CarV1HeaderOrV2Pragma > roots (anon)': /** @returns {undefined|any} */ (/** @type {any} */ obj) => {
if (Kinds.List(obj) === undefined) {
return undefined
}
for (let i = 0; i < obj.length; i++) {
let v = obj[i]
v = Reprs['CarV1HeaderOrV2Pragma > roots (anon) > valueType (anon)'](v)
if (v === undefined) {
return undefined
}
if (v !== obj[i]) {
const ret = obj.slice(0, i)
for (let j = i; j < obj.length; j++) {
let v = obj[j]
v = Reprs['CarV1HeaderOrV2Pragma > roots (anon) > valueType (anon)'](v)
if (v === undefined) {
return undefined
}
ret.push(v)
}
return ret
}
}
return obj
},
Int: Kinds.Int,
CarV1HeaderOrV2Pragma: /** @returns {undefined|any} */ (/** @type {any} */ obj) => {
if (Kinds.Map(obj) === undefined) {
return undefined
}
const entries = Object.entries(obj)
/** @type {{[k in string]: any}} */
let ret = obj
let requiredCount = 1
for (let i = 0; i < entries.length; i++) {
const [key, value] = entries[i]
switch (key) {
case 'roots':
{
const v = Reprs['CarV1HeaderOrV2Pragma > roots (anon)'](value)
if (v === undefined) {
return undefined
}
if (v !== value || ret !== obj) {
if (ret === obj) {
/** @type {{[k in string]: any}} */
ret = {}
for (let j = 0; j < i; j++) {
ret[entries[j][0]] = entries[j][1]
}
}
ret.roots = v
}
}
break
case 'version':
{
requiredCount--
const v = Reprs.Int(value)
if (v === undefined) {
return undefined
}
if (v !== value || ret !== obj) {
if (ret === obj) {
/** @type {{[k in string]: any}} */
ret = {}
for (let j = 0; j < i; j++) {
ret[entries[j][0]] = entries[j][1]
}
}
ret.version = v
}
}
break
default:
return undefined
}
}
if (requiredCount > 0) {
return undefined
}
return ret
}
}
export const CarV1HeaderOrV2Pragma = {
toTyped: Types.CarV1HeaderOrV2Pragma,
toRepresentation: Reprs.CarV1HeaderOrV2Pragma
}