Skip to content

Commit

Permalink
fix bad parse args example
Browse files Browse the repository at this point in the history
  • Loading branch information
PgBiel committed Jan 13, 2025
1 parent ceab405 commit 1004db9
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 23 deletions.
16 changes: 11 additions & 5 deletions docs/book/src/elements/creating/overriding-constr.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,18 +33,24 @@ Here's how you'd use this to implement a positional argument sink:
field("inner", content, default: [Hello!]),
),
parse-args: (default-parser, fields: none, typecheck: none) => (args, include-required: false) => {
let pos = args.pos()
let values = if include-required {
pos
let args = if include-required {
// Convert positional arguments into a single 'values' argument
let values = args.pos()
arguments(values, ..args.named())
} else if args.pos() == () {
args
} else {
assert(false, message: "element 'sunk': unexpected positional arguments\n hint: these can only be passed to the constructor")
}

default-parser(arguments(values, ..args.named()), include-required: include-required)
default-parser(args, include-required: include-required)
},
prefix: ""
)

// Use 'run: func' as an example to test and ensure we received the correct fields
#sunk(5pt, 10pt, black, 5pt + black, run: it => assert.eq(it.values, (5pt, 10pt, black, 5pt + black).map(stroke)))
#sunk(
5pt, 10pt, black, 5pt + black,
run: it => assert.eq(it.values, (5pt, 10pt, black, 5pt + black).map(stroke))
)
```
21 changes: 14 additions & 7 deletions docs/book/src/types/custom-types/other-options.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,25 @@ Here's how you'd use this to implement a positional argument sink:
field("inner", content, default: [Hello!]),
),
parse-args: (default-parser, fields: none, typecheck: none) => (args, include-required: true) => {
let pos = args.pos()
let values = if include-required {
pos
let args = if include-required {
// Convert positional arguments into a single 'values' argument
let values = args.pos()
arguments(values, ..args.named())
} else if args.pos() == () {
// 'include-required' is always true for types, but keeping these here
// just for completeness
args
} else {
// include-required is always true for types, but keep this here just for completeness
assert(false, message: "type 'sunk': unexpected positional arguments\n hint: these can only be passed to the constructor")
assert(false, message: "element 'sunk': unexpected positional arguments\n hint: these can only be passed to the constructor")
}

default-parser(arguments(values, ..args.named()), include-required: include-required)
default-parser(args, include-required: include-required)
},
prefix: ""
)

#assert.eq(e.fields(sunk(5pt, black, 5pt + black, inner: [A])), (values: (stroke(5pt), stroke(black), 5pt + black), inner: [A], color: red))
#assert.eq(
e.fields(sunk(5pt, black, 5pt + black, inner: [Inner])),
(values: (stroke(5pt), stroke(black), 5pt + black), inner: [Inner], color: red)
)
```
19 changes: 14 additions & 5 deletions test/unit/elements/parse-args/test.typ
Original file line number Diff line number Diff line change
Expand Up @@ -93,16 +93,25 @@
field("inner", content, default: [Hello!]),
),
parse-args: (default-parser, fields: none, typecheck: none) => (args, include-required: false) => {
let pos = args.pos()
let values = if include-required {
pos
let args = if include-required {
// Convert positional arguments into a single 'values' argument
let values = args.pos()
arguments(values, ..args.named())
} else if args.pos() == () {
args
} else {
assert(false, message: "element 'sunk': unexpected positional arguments\n hint: these can only be passed to the constructor")
}

default-parser(arguments(values, ..args.named()), include-required: include-required)
default-parser(args, include-required: include-required)
},
prefix: ""
)

#sunk(5pt, 10pt, black, 5pt + black, run: it => assert.eq(it.values, (5pt, 10pt, black, 5pt + black).map(stroke)))
#show: e.set_(sunk, 3, color: blue)

#sunk(5pt, 10pt, black, 5pt + black, run: it => {
let fields = e.fields(it)
_ = fields.remove("run")
assert.eq(fields, (values: (5pt, 10pt, black, 5pt + black).map(stroke), color: blue, inner: [Hello!]))
})
20 changes: 14 additions & 6 deletions test/unit/types/custom/parse-args/test.typ
Original file line number Diff line number Diff line change
Expand Up @@ -59,16 +59,24 @@
field("inner", content, default: [Hello!]),
),
parse-args: (default-parser, fields: none, typecheck: none) => (args, include-required: true) => {
let pos = args.pos()
let values = if include-required {
pos
let args = if include-required {
// Convert positional arguments into a single 'values' argument
let values = args.pos()
arguments(values, ..args.named())
} else if args.pos() == () {
// 'include-required' is always true for types, but keeping these here
// just for completeness
args
} else {
assert(false, message: "type 'sunk': unexpected positional arguments\n hint: these can only be passed to the constructor")
assert(false, message: "element 'sunk': unexpected positional arguments\n hint: these can only be passed to the constructor")
}

default-parser(arguments(values, ..args.named()), include-required: include-required)
default-parser(args, include-required: include-required)
},
prefix: ""
)

#assert.eq(e.fields(sunk(5pt, black, 5pt + black, inner: [A])), (values: (stroke(5pt), stroke(black), 5pt + black), inner: [A], color: red))
#assert.eq(
e.fields(sunk(5pt, black, 5pt + black, inner: [Inner])),
(values: (stroke(5pt), stroke(black), 5pt + black), inner: [Inner], color: red)
)

0 comments on commit 1004db9

Please sign in to comment.