Autogenerated classes for reading and writing CWL objects using the D language.
It integrates with schema-salad-d and provides the following features:
- Support all the CWL v1.0, v1.1 and v1.2 documents
- Load YAML files and nodes to generate corresponding D objects
- Store D object for CWL to YAML nodes
Each parser is generated with schema-salad-tool as shown below.
-
CWL v1.0
$ schema-salad-tool --codegen dlang https://github.com/common-workflow-language/common-workflow-language/raw/codegen/v1.0/CommonWorkflowLanguage.yml --codegen-package cwl.v1_0 --codegen-parser-info "CWL v1.0 parser generated with schema-salad-tool" --codegen-examples resources/cwl-v1.0 > v1_0.d
-
CWL v1.1
$ schema-salad-tool --codegen dlang https://github.com/common-workflow-language/cwl-v1.1/raw/codegen/CommonWorkflowLanguage.yml --codegen-package cwl.v1_1 --codegen-parser-info "CWL v1.1 parser generated with schema-salad-tool" --codegen-examples resources/cwl-v1.1 > v1_1.d
-
CWL v1.2
$ schema-salad-tool --codegen dlang https://github.com/common-workflow-language/cwl-v1.2/raw/codegen/CommonWorkflowLanguage.yml --codegen-package cwl.v1_2 --codegen-parser-info "CWL v1.2 parser generated with schema-salad-tool" --codegen-examples resources/cwl-v1.2 > v1_2.d
-
You can specify the package name via
--codegen-package
. -
You can add informative message into the generated package via
--codegen-parser-info
. It can be accessed viacwl.v1_2.parserInfo
.
See source/app.d for a concrete example.
import cwl.v1_0; // auto generated CWL parser
import salad.resolver : absoluteURI;
import dyaml : Node;
import std : match, tryMatch, writefln;
///// Loading file
auto uri = file.absoluteURI;
// dispatch with std.sumtype.match for loaded object
auto doc = importFromURI(uri).match!(
// typical case
(DocumentRootType r) => r,
// When loaded CWL has `$graph`, the result is DocumentRootType[]
(DocumentRootType[] rs) => rs[0],
);
// use std.sumtype.tryMatch if you can assume the type of target object
// The following `tryMatch` assumes `doc` is CLT or Workflow. Otherwise it throws an exception
auto classStr = doc.tryMatch!(
(CommandLineTool clt) => "CommandLineTool",
(Workflow wf) => "Workflow",
);
writefln!"%s is %s class."(uri, classStr);
///// Convert CWL object to YAML node
auto yamlNode = doc.match!(d => Node(d));
The example just prints the document class of a given CWL document.
$ dub run -c demo -- resources/cwl-v1.0/valid_rename.cwl
...
Running cwl-d-auto resources/cwl-v1.0/valid_rename.cwl
file:///workspaces/cwl-d-auto/resources/cwl-v1.0/valid_rename.cwl is CommandLineTool class.
It checks that CWL documents in resources
can be loaded with parsers in source/cwl
.
$ dub test