Back to Examples
- Binding patterns
- Typed binding pattern
- Wildcard binding pattern
- List binding patterns
- Rest binding pattern in list binding pattern
- Mapping binding pattern
- Rest binding pattern in mapping binding pattern
- Error binding pattern
- Rest binding pattern in error binding pattern
- Single use of typed binding patterns
- Single use of typed binding patterns with on fail clause
- Iterative use of typed binding patterns
- List binding pattern in match statement
- Mapping binding pattern in match statement
- Error binding pattern in match statement
- Query expressions
- Sort iterable objects
- Let clause
- Limit clause
- Join iterable objects
- Outer Join clause
- Query tables
- Create tables with a query
- Create maps with a query
- Create streams with a query
- On conflict clause
- Advanced conflict handling
- Iterate over XML with a query
- Nested query expressions
- Destructure records using a query
- Querying streams
- Aggregation
- JSON type
- Access JSON elements
- Access optional JSON elements
- Match statement with maps
- Convert from user-defined type to JSON
- Convert from table and XML to JSON
- Convert from JSON to user-defined type
- Cast JSON to user-defined type
- Resource method typing
- JSON numbers
- JSON to record
- JSON to record with projection
- JSONPath expressions
- Asynchronous function calls
- Named workers
- Sequence diagrams
- Wait for workers
- Strands
- Named worker return values
- Alternate wait
- Multiple wait
- Named workers and futures
- Inter-worker message passing
- Alternate receive
- Multiple receive
- Conditional send
- Inter-worker failure propagation
- Named worker with on fail clause
- Synchronize message passing
- Asynchronize message passing
- Flush
- Fork
Rest binding pattern in error binding pattern
You can use the rest binding pattern (...r
) to bind the detail mappings that are not explicitly bound in the error binding pattern. The type of the rest binding will be a map
holding the fields that have not been matched.
import ballerina/io;
type SampleErrorData record {|
int code;
string reason;
|};
type SampleError error<SampleErrorData>;
public function main() {
// The detail mapping can be destructured using a rest parameter.
// `details` is of type `map<string|boolean>` having the `code` and `reason` fields.
var error(message, ...details) = getSampleError();
io:println("Message: ", message);
map<int|string> detailsMap = details;
io:println("Details: ", detailsMap);
// Here, the `...filteredDetails` rest parameter contains only the detail fields
// that are not matched.
var error(_, code = code, ...filteredDetails) = getSampleError();
io:println("Code: ", code);
io:println("Filtered Details: ", filteredDetails);
map<int|string> moreDetails;
// The detail mapping can be destructured into a `map<int|string>` typed variable
// by using a rest parameter.
error(_, ...moreDetails) = getSampleError();
io:println("All Details: ", moreDetails);
}
function getSampleError() returns SampleError {
return error("Transaction Failure", error("Database Error"), code = 20,
reason = "deadlock condition");
}
$ bal run rest_binding_pattern_in_error_binding_pattern.balMessage: Transaction FailureDetails: {"code":20,"reason":"deadlock condition"}Code: 20Filtered Details: {"reason":"deadlock condition"}All Details: {"code":20,"reason":"deadlock condition"}
Related links
PreviousError binding pattern
NextSingle use of typed binding patterns