diff --git a/Cargo.toml b/Cargo.toml index c7f95950a..b3c2209c4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,6 +33,7 @@ dirs = "5.0.1" faster-hex = "0.9.0" futures = "0.3.30" git2 = "0.18.3" +glob = "0.3.1" id-arena = "2.2.1" indexmap = { version = "2.2.6", features = ["serde"] } indicatif = "0.17.8" diff --git a/Gauntlet.toml b/Gauntlet.toml index 34b2787d1..7fea1aa88 100644 --- a/Gauntlet.toml +++ b/Gauntlet.toml @@ -4,7 +4,7 @@ commit_hash = "26eeda81a0540dc793fc69b0c390d232ca7ca50a" [repositories."PacificBiosciences/HiFi-human-WGS-WDL"] identifier = "PacificBiosciences/HiFi-human-WGS-WDL" -commit_hash = "0aba3fb4712f65b244e56e46eecf24cc550a2fd3" +commit_hash = "0a2dd537383b137ebc888695c0ecd6d13d75761b" [repositories."aws-samples/amazon-omics-tutorials"] identifier = "aws-samples/amazon-omics-tutorials" @@ -24,7 +24,7 @@ commit_hash = "58f72308bdf511a760dea92dbf2ac21eb2c7dc0e" [repositories."broadinstitute/warp"] identifier = "broadinstitute/warp" -commit_hash = "6fda53e5a80d0ce7923785f95a0acb157558dadd" +commit_hash = "158772d35e6e83ecbdd43450e6cd2d7f3519bfc7" [repositories."chanzuckerberg/czid-workflows"] identifier = "chanzuckerberg/czid-workflows" @@ -49,7 +49,7 @@ filters = ["/template/task-templates.wdl"] [repositories."theiagen/public_health_bioinformatics"] identifier = "theiagen/public_health_bioinformatics" -commit_hash = "2669f994a90dc2c6d6703eef14cf3c639a7bfc1c" +commit_hash = "ad49a36614ab3a5a4713318c429ccd07f5486318" [[diagnostics]] document = "ENCODE-DCC/chip-seq-pipeline2:/chip.wdl" @@ -199,112 +199,112 @@ permalink = "https://github.com/ENCODE-DCC/chip-seq-pipeline2/blob/26eeda81a0540 [[diagnostics]] document = "PacificBiosciences/HiFi-human-WGS-WDL:/workflows/joint/joint.wdl" message = "joint.wdl:131:28: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0aba3fb4712f65b244e56e46eecf24cc550a2fd3/workflows/joint/joint.wdl/#L131" +permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0a2dd537383b137ebc888695c0ecd6d13d75761b/workflows/joint/joint.wdl/#L131" [[diagnostics]] document = "PacificBiosciences/HiFi-human-WGS-WDL:/workflows/joint/joint.wdl" message = "joint.wdl:94:30: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0aba3fb4712f65b244e56e46eecf24cc550a2fd3/workflows/joint/joint.wdl/#L94" +permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0a2dd537383b137ebc888695c0ecd6d13d75761b/workflows/joint/joint.wdl/#L94" [[diagnostics]] document = "PacificBiosciences/HiFi-human-WGS-WDL:/workflows/singleton.wdl" message = "singleton.wdl:3:8: warning[UnusedImport]: unused import namespace `humanwgs_structs`" -permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0aba3fb4712f65b244e56e46eecf24cc550a2fd3/workflows/singleton.wdl/#L3" +permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0a2dd537383b137ebc888695c0ecd6d13d75761b/workflows/singleton.wdl/#L3" [[diagnostics]] document = "PacificBiosciences/HiFi-human-WGS-WDL:/workflows/tertiary/tertiary.wdl" message = "tertiary.wdl:3:8: warning[UnusedImport]: unused import namespace `humanwgs_structs`" -permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0aba3fb4712f65b244e56e46eecf24cc550a2fd3/workflows/tertiary/tertiary.wdl/#L3" +permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0a2dd537383b137ebc888695c0ecd6d13d75761b/workflows/tertiary/tertiary.wdl/#L3" [[diagnostics]] document = "PacificBiosciences/HiFi-human-WGS-WDL:/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl" message = "backend_configuration.wdl:101:28: error: type mismatch: a type common to both type `String` and type `Int` does not exist" -permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0aba3fb4712f65b244e56e46eecf24cc550a2fd3/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L101" +permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0a2dd537383b137ebc888695c0ecd6d13d75761b/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L101" [[diagnostics]] document = "PacificBiosciences/HiFi-human-WGS-WDL:/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl" message = "backend_configuration.wdl:102:22: error: type mismatch: a type common to both type `String` and type `Int` does not exist" -permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0aba3fb4712f65b244e56e46eecf24cc550a2fd3/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L102" +permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0a2dd537383b137ebc888695c0ecd6d13d75761b/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L102" [[diagnostics]] document = "PacificBiosciences/HiFi-human-WGS-WDL:/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl" message = "backend_configuration.wdl:112:48: error: type mismatch: expected type `RuntimeAttributes`, but found type `Map[String, String]`" -permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0aba3fb4712f65b244e56e46eecf24cc550a2fd3/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L112" +permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0a2dd537383b137ebc888695c0ecd6d13d75761b/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L112" [[diagnostics]] document = "PacificBiosciences/HiFi-human-WGS-WDL:/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl" message = "backend_configuration.wdl:114:28: error: type mismatch: a type common to both type `String` and type `Int` does not exist" -permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0aba3fb4712f65b244e56e46eecf24cc550a2fd3/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L114" +permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0a2dd537383b137ebc888695c0ecd6d13d75761b/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L114" [[diagnostics]] document = "PacificBiosciences/HiFi-human-WGS-WDL:/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl" message = "backend_configuration.wdl:115:22: error: type mismatch: a type common to both type `String` and type `Int` does not exist" -permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0aba3fb4712f65b244e56e46eecf24cc550a2fd3/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L115" +permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0a2dd537383b137ebc888695c0ecd6d13d75761b/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L115" [[diagnostics]] document = "PacificBiosciences/HiFi-human-WGS-WDL:/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl" message = "backend_configuration.wdl:46:53: error: type mismatch: expected type `RuntimeAttributes`, but found type `Map[String, String]`" -permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0aba3fb4712f65b244e56e46eecf24cc550a2fd3/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L46" +permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0a2dd537383b137ebc888695c0ecd6d13d75761b/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L46" [[diagnostics]] document = "PacificBiosciences/HiFi-human-WGS-WDL:/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl" message = "backend_configuration.wdl:48:28: error: type mismatch: a type common to both type `String` and type `Int` does not exist" -permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0aba3fb4712f65b244e56e46eecf24cc550a2fd3/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L48" +permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0a2dd537383b137ebc888695c0ecd6d13d75761b/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L48" [[diagnostics]] document = "PacificBiosciences/HiFi-human-WGS-WDL:/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl" message = "backend_configuration.wdl:49:22: error: type mismatch: a type common to both type `String` and type `Int` does not exist" -permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0aba3fb4712f65b244e56e46eecf24cc550a2fd3/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L49" +permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0a2dd537383b137ebc888695c0ecd6d13d75761b/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L49" [[diagnostics]] document = "PacificBiosciences/HiFi-human-WGS-WDL:/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl" message = "backend_configuration.wdl:55:58: error: type mismatch: expected type `RuntimeAttributes`, but found type `Map[String, String]`" -permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0aba3fb4712f65b244e56e46eecf24cc550a2fd3/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L55" +permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0a2dd537383b137ebc888695c0ecd6d13d75761b/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L55" [[diagnostics]] document = "PacificBiosciences/HiFi-human-WGS-WDL:/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl" message = "backend_configuration.wdl:57:28: error: type mismatch: a type common to both type `String` and type `Int` does not exist" -permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0aba3fb4712f65b244e56e46eecf24cc550a2fd3/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L57" +permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0a2dd537383b137ebc888695c0ecd6d13d75761b/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L57" [[diagnostics]] document = "PacificBiosciences/HiFi-human-WGS-WDL:/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl" message = "backend_configuration.wdl:58:22: error: type mismatch: a type common to both type `String` and type `Int` does not exist" -permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0aba3fb4712f65b244e56e46eecf24cc550a2fd3/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L58" +permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0a2dd537383b137ebc888695c0ecd6d13d75761b/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L58" [[diagnostics]] document = "PacificBiosciences/HiFi-human-WGS-WDL:/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl" message = "backend_configuration.wdl:70:55: error: type mismatch: expected type `RuntimeAttributes`, but found type `Map[String, String]`" -permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0aba3fb4712f65b244e56e46eecf24cc550a2fd3/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L70" +permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0a2dd537383b137ebc888695c0ecd6d13d75761b/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L70" [[diagnostics]] document = "PacificBiosciences/HiFi-human-WGS-WDL:/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl" message = "backend_configuration.wdl:72:28: error: type mismatch: a type common to both type `String` and type `Int` does not exist" -permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0aba3fb4712f65b244e56e46eecf24cc550a2fd3/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L72" +permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0a2dd537383b137ebc888695c0ecd6d13d75761b/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L72" [[diagnostics]] document = "PacificBiosciences/HiFi-human-WGS-WDL:/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl" message = "backend_configuration.wdl:73:22: error: type mismatch: a type common to both type `String` and type `Int` does not exist" -permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0aba3fb4712f65b244e56e46eecf24cc550a2fd3/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L73" +permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0a2dd537383b137ebc888695c0ecd6d13d75761b/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L73" [[diagnostics]] document = "PacificBiosciences/HiFi-human-WGS-WDL:/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl" message = "backend_configuration.wdl:79:60: error: type mismatch: expected type `RuntimeAttributes`, but found type `Map[String, String]`" -permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0aba3fb4712f65b244e56e46eecf24cc550a2fd3/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L79" +permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0a2dd537383b137ebc888695c0ecd6d13d75761b/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L79" [[diagnostics]] document = "PacificBiosciences/HiFi-human-WGS-WDL:/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl" message = "backend_configuration.wdl:81:28: error: type mismatch: a type common to both type `String` and type `Int` does not exist" -permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0aba3fb4712f65b244e56e46eecf24cc550a2fd3/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L81" +permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0a2dd537383b137ebc888695c0ecd6d13d75761b/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L81" [[diagnostics]] document = "PacificBiosciences/HiFi-human-WGS-WDL:/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl" message = "backend_configuration.wdl:82:22: error: type mismatch: a type common to both type `String` and type `Int` does not exist" -permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0aba3fb4712f65b244e56e46eecf24cc550a2fd3/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L82" +permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0a2dd537383b137ebc888695c0ecd6d13d75761b/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L82" [[diagnostics]] document = "PacificBiosciences/HiFi-human-WGS-WDL:/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl" message = "backend_configuration.wdl:99:70: error: type mismatch: expected type `RuntimeAttributes`, but found type `Map[String, String]`" -permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0aba3fb4712f65b244e56e46eecf24cc550a2fd3/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L99" +permalink = "https://github.com/PacificBiosciences/HiFi-human-WGS-WDL/blob/0a2dd537383b137ebc888695c0ecd6d13d75761b/workflows/wdl-common/wdl/workflows/backend_configuration/backend_configuration.wdl/#L99" [[diagnostics]] document = "aws-samples/amazon-omics-tutorials:/example-workflows/gatk-best-practices/workflows/fastqs-to-analysis-ready-bam/main.wdl" @@ -2104,1967 +2104,1987 @@ permalink = "https://github.com/broadinstitute/palantir-workflows/blob/58f72308b [[diagnostics]] document = "broadinstitute/warp:/beta-pipelines/broad/somatic/single_sample/targeted/TargetedSomaticSingleSample.wdl" message = "TargetedSomaticSingleSample.wdl:18:8: warning[UnusedImport]: unused import namespace `DNASeqStructs`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/beta-pipelines/broad/somatic/single_sample/targeted/TargetedSomaticSingleSample.wdl/#L18" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/beta-pipelines/broad/somatic/single_sample/targeted/TargetedSomaticSingleSample.wdl/#L18" [[diagnostics]] document = "broadinstitute/warp:/beta-pipelines/broad/somatic/single_sample/targeted/TargetedSomaticSingleSample.wdl" message = "TargetedSomaticSingleSample.wdl:23:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/beta-pipelines/broad/somatic/single_sample/targeted/TargetedSomaticSingleSample.wdl/#L23" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/beta-pipelines/broad/somatic/single_sample/targeted/TargetedSomaticSingleSample.wdl/#L23" [[diagnostics]] document = "broadinstitute/warp:/beta-pipelines/skylab/BuildIndexHisat/BuildIndexHisat3n.9.wdl" message = "BuildIndexHisat3n.9.wdl:9:15: warning[UnusedInput]: unused input `monitoring_script_path`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/beta-pipelines/skylab/BuildIndexHisat/BuildIndexHisat3n.9.wdl/#L9" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/beta-pipelines/skylab/BuildIndexHisat/BuildIndexHisat3n.9.wdl/#L9" [[diagnostics]] document = "broadinstitute/warp:/beta-pipelines/skylab/slidetags/SlideTags.wdl" message = "SlideTags.wdl:11:16: warning[UnusedInput]: unused input `id`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/beta-pipelines/skylab/slidetags/SlideTags.wdl/#L11" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/beta-pipelines/skylab/slidetags/SlideTags.wdl/#L11" [[diagnostics]] document = "broadinstitute/warp:/beta-pipelines/skylab/slidetags/SlideTags.wdl" message = "SlideTags.wdl:15:16: warning[UnusedInput]: unused input `sb_path`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/beta-pipelines/skylab/slidetags/SlideTags.wdl/#L15" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/beta-pipelines/skylab/slidetags/SlideTags.wdl/#L15" [[diagnostics]] document = "broadinstitute/warp:/beta-pipelines/skylab/slidetags/SlideTags.wdl" message = "SlideTags.wdl:32:46: warning[UnusedCall]: unused call `positioning`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/beta-pipelines/skylab/slidetags/SlideTags.wdl/#L32" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/beta-pipelines/skylab/slidetags/SlideTags.wdl/#L32" [[diagnostics]] document = "broadinstitute/warp:/beta-pipelines/skylab/slidetags/SlideTags.wdl" message = "SlideTags.wdl:8:12: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/beta-pipelines/skylab/slidetags/SlideTags.wdl/#L8" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/beta-pipelines/skylab/slidetags/SlideTags.wdl/#L8" [[diagnostics]] document = "broadinstitute/warp:/deprecated/pipelines/cemba/build_cemba_references/BuildCembaReferences.wdl" message = "BuildCembaReferences.wdl:9:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/deprecated/pipelines/cemba/build_cemba_references/BuildCembaReferences.wdl/#L9" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/deprecated/pipelines/cemba/build_cemba_references/BuildCembaReferences.wdl/#L9" [[diagnostics]] document = "broadinstitute/warp:/deprecated/pipelines/cemba/cemba_methylcseq/CEMBA.wdl" message = "CEMBA.wdl:60:12: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/deprecated/pipelines/cemba/cemba_methylcseq/CEMBA.wdl/#L60" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/deprecated/pipelines/cemba/cemba_methylcseq/CEMBA.wdl/#L60" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/annotation_filtration/AnnotationFiltration.wdl" message = "AnnotationFiltration.wdl:104:12: warning[UnusedInput]: unused input `significant_variants_file`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/annotation_filtration/AnnotationFiltration.wdl/#L104" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/annotation_filtration/AnnotationFiltration.wdl/#L104" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/annotation_filtration/AnnotationFiltration.wdl" message = "AnnotationFiltration.wdl:77:54: error: type mismatch: a type common to both type `File` and type `Int` does not exist" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/annotation_filtration/AnnotationFiltration.wdl/#L77" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/annotation_filtration/AnnotationFiltration.wdl/#L77" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/annotation_filtration/AnnotationFiltration.wdl" message = "AnnotationFiltration.wdl:7:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/annotation_filtration/AnnotationFiltration.wdl/#L7" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/annotation_filtration/AnnotationFiltration.wdl/#L7" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/arrays/imputation/Imputation.wdl" message = "Imputation.wdl:262:46: error: type mismatch: argument to function `select_all` expects type `Array[X]` where `X`: any optional type, but found type `Array[File]`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/arrays/imputation/Imputation.wdl/#L262" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/arrays/imputation/Imputation.wdl/#L262" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/arrays/imputation/Imputation.wdl" message = "Imputation.wdl:9:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/arrays/imputation/Imputation.wdl/#L9" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/arrays/imputation/Imputation.wdl/#L9" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/arrays/multi_sample/MultiSampleArrays.wdl" message = "MultiSampleArrays.wdl:21:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/arrays/multi_sample/MultiSampleArrays.wdl/#L21" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/arrays/multi_sample/MultiSampleArrays.wdl/#L21" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/arrays/multi_sample/MultiSampleArrays.wdl" message = "MultiSampleArrays.wdl:26:10: warning[UnusedInput]: unused input `ref_fasta`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/arrays/multi_sample/MultiSampleArrays.wdl/#L26" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/arrays/multi_sample/MultiSampleArrays.wdl/#L26" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/arrays/single_sample/Arrays.wdl" message = "Arrays.wdl:26:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/arrays/single_sample/Arrays.wdl/#L26" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/arrays/single_sample/Arrays.wdl/#L26" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/arrays/single_sample/Arrays.wdl" message = "Arrays.wdl:322:28: warning[UnusedCall]: unused call `UpdateChipWellBarcodeIndex`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/arrays/single_sample/Arrays.wdl/#L322" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/arrays/single_sample/Arrays.wdl/#L322" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/arrays/validate_chip/ValidateChip.wdl" message = "ValidateChip.wdl:137:24: warning[UnusedCall]: unused call `ValidateVariants`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/arrays/validate_chip/ValidateChip.wdl/#L137" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/arrays/validate_chip/ValidateChip.wdl/#L137" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/arrays/validate_chip/ValidateChip.wdl" message = "ValidateChip.wdl:255:10: warning[UnusedInput]: unused input `call_vcf_index_file`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/arrays/validate_chip/ValidateChip.wdl/#L255" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/arrays/validate_chip/ValidateChip.wdl/#L255" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/arrays/validate_chip/ValidateChip.wdl" message = "ValidateChip.wdl:259:10: warning[UnusedInput]: unused input `truth_vcf_index_file`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/arrays/validate_chip/ValidateChip.wdl/#L259" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/arrays/validate_chip/ValidateChip.wdl/#L259" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/arrays/validate_chip/ValidateChip.wdl" message = "ValidateChip.wdl:4:61: warning[UnusedImport]: unused import namespace `InternalTasks`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/arrays/validate_chip/ValidateChip.wdl/#L4" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/arrays/validate_chip/ValidateChip.wdl/#L4" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/joint_genotyping/JointGenotyping.wdl" message = "JointGenotyping.wdl:10:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/joint_genotyping/JointGenotyping.wdl/#L10" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/joint_genotyping/JointGenotyping.wdl/#L10" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/joint_genotyping/JointGenotyping.wdl" message = "JointGenotyping.wdl:205:81: error: type mismatch: string concatenation is not supported for type `File?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/joint_genotyping/JointGenotyping.wdl/#L205" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/joint_genotyping/JointGenotyping.wdl/#L205" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/joint_genotyping/JointGenotyping.wdl" message = "JointGenotyping.wdl:397:41: error: type mismatch: expected type `Array[Int]`, but found type `Array[String]`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/joint_genotyping/JointGenotyping.wdl/#L397" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/joint_genotyping/JointGenotyping.wdl/#L397" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/joint_genotyping/JointGenotyping.wdl" message = "JointGenotyping.wdl:62:13: warning[UnusedInput]: unused input `rename_gvcf_samples`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/joint_genotyping/JointGenotyping.wdl/#L62" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/joint_genotyping/JointGenotyping.wdl/#L62" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/joint_genotyping/UltimaGenomics/UltimaGenomicsJointGenotyping.wdl" message = "UltimaGenomicsJointGenotyping.wdl:14:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/joint_genotyping/UltimaGenomics/UltimaGenomicsJointGenotyping.wdl/#L14" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/joint_genotyping/UltimaGenomics/UltimaGenomicsJointGenotyping.wdl/#L14" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/joint_genotyping/UltimaGenomics/UltimaGenomicsJointGenotyping.wdl" message = "UltimaGenomicsJointGenotyping.wdl:269:41: error: type mismatch: expected type `Array[Int]`, but found type `Array[String]`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/joint_genotyping/UltimaGenomics/UltimaGenomicsJointGenotyping.wdl/#L269" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/joint_genotyping/UltimaGenomics/UltimaGenomicsJointGenotyping.wdl/#L269" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/joint_genotyping/UltimaGenomics/UltimaGenomicsJointGenotyping.wdl" message = "UltimaGenomicsJointGenotyping.wdl:63:13: warning[UnusedInput]: unused input `cross_check_fingerprints`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/joint_genotyping/UltimaGenomics/UltimaGenomicsJointGenotyping.wdl/#L63" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/joint_genotyping/UltimaGenomics/UltimaGenomicsJointGenotyping.wdl/#L63" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartOne.wdl" message = "JointGenotypingByChromosomePartOne.wdl:210:41: error: type mismatch: expected type `Array[Int]`, but found type `Array[String]`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartOne.wdl/#L210" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartOne.wdl/#L210" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartOne.wdl" message = "JointGenotypingByChromosomePartOne.wdl:47:23: warning[UnusedInput]: unused input `gnarly_workaround_annotations`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartOne.wdl/#L47" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartOne.wdl/#L47" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartOne.wdl" message = "JointGenotypingByChromosomePartOne.wdl:8:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartOne.wdl/#L8" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartOne.wdl/#L8" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartTwo.wdl" message = "JointGenotypingByChromosomePartTwo.wdl:14:10: warning[UnusedInput]: unused input `ref_fasta`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartTwo.wdl/#L14" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartTwo.wdl/#L14" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartTwo.wdl" message = "JointGenotypingByChromosomePartTwo.wdl:23:9: warning[UnusedInput]: unused input `large_disk`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartTwo.wdl/#L23" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartTwo.wdl/#L23" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartTwo.wdl" message = "JointGenotypingByChromosomePartTwo.wdl:24:9: warning[UnusedInput]: unused input `huge_disk`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartTwo.wdl/#L24" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartTwo.wdl/#L24" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartTwo.wdl" message = "JointGenotypingByChromosomePartTwo.wdl:58:11: warning[UnusedInput]: unused input `excess_het_threshold`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartTwo.wdl/#L58" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartTwo.wdl/#L58" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartTwo.wdl" message = "JointGenotypingByChromosomePartTwo.wdl:61:9: warning[UnusedInput]: unused input `SNP_VQSR_downsampleFactor`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartTwo.wdl/#L61" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartTwo.wdl/#L61" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartTwo.wdl" message = "JointGenotypingByChromosomePartTwo.wdl:75:15: warning[UnusedDeclaration]: unused declaration `fingerprinting_vcf_indices`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartTwo.wdl/#L75" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartTwo.wdl/#L75" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartTwo.wdl" message = "JointGenotypingByChromosomePartTwo.wdl:78:7: warning[UnusedDeclaration]: unused declaration `num_gvcfs`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartTwo.wdl/#L78" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartTwo.wdl/#L78" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartTwo.wdl" message = "JointGenotypingByChromosomePartTwo.wdl:8:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartTwo.wdl/#L8" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/joint_genotyping/by_chromosome/JointGenotypingByChromosomePartTwo.wdl/#L8" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/joint_genotyping/reblocking/ReblockGVCF.wdl" message = "ReblockGVCF.wdl:51:35: error: type mismatch: expected type `Boolean`, but found type `Boolean?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/joint_genotyping/reblocking/ReblockGVCF.wdl/#L51" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/joint_genotyping/reblocking/ReblockGVCF.wdl/#L51" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/joint_genotyping/reblocking/ReblockGVCF.wdl" message = "ReblockGVCF.wdl:57:28: warning[UnusedCall]: unused call `ValidateVCF`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/joint_genotyping/reblocking/ReblockGVCF.wdl/#L57" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/joint_genotyping/reblocking/ReblockGVCF.wdl/#L57" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/joint_genotyping/reblocking/ReblockGVCF.wdl" message = "ReblockGVCF.wdl:9:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/joint_genotyping/reblocking/ReblockGVCF.wdl/#L9" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/joint_genotyping/reblocking/ReblockGVCF.wdl/#L9" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/single_sample/exome/ExomeGermlineSingleSample.wdl" message = "ExomeGermlineSingleSample.wdl:42:8: warning[UnusedImport]: unused import namespace `DNASeqStructs`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/single_sample/exome/ExomeGermlineSingleSample.wdl/#L42" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/single_sample/exome/ExomeGermlineSingleSample.wdl/#L42" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/single_sample/exome/ExomeGermlineSingleSample.wdl" message = "ExomeGermlineSingleSample.wdl:48:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/single_sample/exome/ExomeGermlineSingleSample.wdl/#L48" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/single_sample/exome/ExomeGermlineSingleSample.wdl/#L48" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/single_sample/exome/ExomeGermlineSingleSample.wdl" message = "ExomeGermlineSingleSample.wdl:73:10: warning[UnusedDeclaration]: unused declaration `gatk_docker`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/single_sample/exome/ExomeGermlineSingleSample.wdl/#L73" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/single_sample/exome/ExomeGermlineSingleSample.wdl/#L73" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/single_sample/ugwgs/UltimaGenomicsWholeGenomeGermline.wdl" message = "UltimaGenomicsWholeGenomeGermline.wdl:10:83: warning[UnusedImport]: unused import namespace `UltimaGenomicsWholeGenomeGermlineQC`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/single_sample/ugwgs/UltimaGenomicsWholeGenomeGermline.wdl/#L10" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/single_sample/ugwgs/UltimaGenomicsWholeGenomeGermline.wdl/#L10" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/single_sample/ugwgs/UltimaGenomicsWholeGenomeGermline.wdl" message = "UltimaGenomicsWholeGenomeGermline.wdl:11:92: warning[UnusedImport]: unused import namespace `Structs`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/single_sample/ugwgs/UltimaGenomicsWholeGenomeGermline.wdl/#L11" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/single_sample/ugwgs/UltimaGenomicsWholeGenomeGermline.wdl/#L11" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/single_sample/ugwgs/UltimaGenomicsWholeGenomeGermline.wdl" message = "UltimaGenomicsWholeGenomeGermline.wdl:53:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/single_sample/ugwgs/UltimaGenomicsWholeGenomeGermline.wdl/#L53" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/single_sample/ugwgs/UltimaGenomicsWholeGenomeGermline.wdl/#L53" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/single_sample/ugwgs/UltimaGenomicsWholeGenomeGermline.wdl" message = "UltimaGenomicsWholeGenomeGermline.wdl:62:25: error: type mismatch: expected type `Array[File]`, but found type `Array[File]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/single_sample/ugwgs/UltimaGenomicsWholeGenomeGermline.wdl/#L62" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/single_sample/ugwgs/UltimaGenomicsWholeGenomeGermline.wdl/#L62" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/single_sample/ugwgs/UltimaGenomicsWholeGenomeGermline.wdl" message = "UltimaGenomicsWholeGenomeGermline.wdl:63:24: error: type mismatch: expected type `Array[File]`, but found type `Array[File]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/single_sample/ugwgs/UltimaGenomicsWholeGenomeGermline.wdl/#L63" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/single_sample/ugwgs/UltimaGenomicsWholeGenomeGermline.wdl/#L63" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/single_sample/ugwgs/UltimaGenomicsWholeGenomeGermline.wdl" message = "UltimaGenomicsWholeGenomeGermline.wdl:7:104: warning[UnusedImport]: unused import namespace `UltimaGenomicsWholeGenomeGermlineAlignmentMarkDuplicates`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/single_sample/ugwgs/UltimaGenomicsWholeGenomeGermline.wdl/#L7" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/single_sample/ugwgs/UltimaGenomicsWholeGenomeGermline.wdl/#L7" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/single_sample/ugwgs/UltimaGenomicsWholeGenomeGermline.wdl" message = "UltimaGenomicsWholeGenomeGermline.wdl:83:7: warning[UnusedDeclaration]: unused declaration `hc_divisor`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/single_sample/ugwgs/UltimaGenomicsWholeGenomeGermline.wdl/#L83" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/single_sample/ugwgs/UltimaGenomicsWholeGenomeGermline.wdl/#L83" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/single_sample/ugwgs/UltimaGenomicsWholeGenomeGermline.wdl" message = "UltimaGenomicsWholeGenomeGermline.wdl:8:61: warning[UnusedImport]: unused import namespace `InternalTasks`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/single_sample/ugwgs/UltimaGenomicsWholeGenomeGermline.wdl/#L8" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/single_sample/ugwgs/UltimaGenomicsWholeGenomeGermline.wdl/#L8" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/single_sample/ugwgs/UltimaGenomicsWholeGenomeGermline.wdl" message = "UltimaGenomicsWholeGenomeGermline.wdl:9:50: warning[UnusedImport]: unused import namespace `QC`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/single_sample/ugwgs/UltimaGenomicsWholeGenomeGermline.wdl/#L9" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/single_sample/ugwgs/UltimaGenomicsWholeGenomeGermline.wdl/#L9" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/single_sample/wgs/WholeGenomeGermlineSingleSample.wdl" message = "WholeGenomeGermlineSingleSample.wdl:109:37: error: type mismatch: expected type `DragmapReference`, but found type `DragmapReference?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/single_sample/wgs/WholeGenomeGermlineSingleSample.wdl/#L109" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/single_sample/wgs/WholeGenomeGermlineSingleSample.wdl/#L109" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/single_sample/wgs/WholeGenomeGermlineSingleSample.wdl" message = "WholeGenomeGermlineSingleSample.wdl:37:8: warning[UnusedImport]: unused import namespace `DNASeqStructs`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/single_sample/wgs/WholeGenomeGermlineSingleSample.wdl/#L37" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/single_sample/wgs/WholeGenomeGermlineSingleSample.wdl/#L37" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/single_sample/wgs/WholeGenomeGermlineSingleSample.wdl" message = "WholeGenomeGermlineSingleSample.wdl:43:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/single_sample/wgs/WholeGenomeGermlineSingleSample.wdl/#L43" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/single_sample/wgs/WholeGenomeGermlineSingleSample.wdl/#L43" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/variant_calling/VariantCalling.wdl" message = "VariantCalling.wdl:12:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/variant_calling/VariantCalling.wdl/#L12" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/variant_calling/VariantCalling.wdl/#L12" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/germline/variant_calling/VariantCalling.wdl" message = "VariantCalling.wdl:209:26: warning[UnusedCall]: unused call `ValidateVCF`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/germline/variant_calling/VariantCalling.wdl/#L209" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/germline/variant_calling/VariantCalling.wdl/#L209" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/somatic/single_sample/ugwgs/UltimaGenomicsWholeGenomeCramOnly.wdl" message = "UltimaGenomicsWholeGenomeCramOnly.wdl:10:92: warning[UnusedImport]: unused import namespace `Structs`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/somatic/single_sample/ugwgs/UltimaGenomicsWholeGenomeCramOnly.wdl/#L10" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/somatic/single_sample/ugwgs/UltimaGenomicsWholeGenomeCramOnly.wdl/#L10" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/somatic/single_sample/ugwgs/UltimaGenomicsWholeGenomeCramOnly.wdl" message = "UltimaGenomicsWholeGenomeCramOnly.wdl:46:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/somatic/single_sample/ugwgs/UltimaGenomicsWholeGenomeCramOnly.wdl/#L46" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/somatic/single_sample/ugwgs/UltimaGenomicsWholeGenomeCramOnly.wdl/#L46" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/somatic/single_sample/ugwgs/UltimaGenomicsWholeGenomeCramOnly.wdl" message = "UltimaGenomicsWholeGenomeCramOnly.wdl:58:25: error: type mismatch: expected type `Array[String]`, but found type `Array[File]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/somatic/single_sample/ugwgs/UltimaGenomicsWholeGenomeCramOnly.wdl/#L58" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/somatic/single_sample/ugwgs/UltimaGenomicsWholeGenomeCramOnly.wdl/#L58" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/somatic/single_sample/ugwgs/UltimaGenomicsWholeGenomeCramOnly.wdl" message = "UltimaGenomicsWholeGenomeCramOnly.wdl:59:25: error: type mismatch: expected type `Array[String]`, but found type `Array[File]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/somatic/single_sample/ugwgs/UltimaGenomicsWholeGenomeCramOnly.wdl/#L59" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/somatic/single_sample/ugwgs/UltimaGenomicsWholeGenomeCramOnly.wdl/#L59" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/somatic/single_sample/ugwgs/UltimaGenomicsWholeGenomeCramOnly.wdl" message = "UltimaGenomicsWholeGenomeCramOnly.wdl:5:72: warning[UnusedImport]: unused import namespace `VariantDiscoverTasks`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/somatic/single_sample/ugwgs/UltimaGenomicsWholeGenomeCramOnly.wdl/#L5" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/somatic/single_sample/ugwgs/UltimaGenomicsWholeGenomeCramOnly.wdl/#L5" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/somatic/single_sample/ugwgs/UltimaGenomicsWholeGenomeCramOnly.wdl" message = "UltimaGenomicsWholeGenomeCramOnly.wdl:87:30: warning[UnusedCall]: unused call `ValidateCram`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/somatic/single_sample/ugwgs/UltimaGenomicsWholeGenomeCramOnly.wdl/#L87" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/somatic/single_sample/ugwgs/UltimaGenomicsWholeGenomeCramOnly.wdl/#L87" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/somatic/single_sample/wgs/gdc_genome/GDCWholeGenomeSomaticSingleSample.wdl" message = "GDCWholeGenomeSomaticSingleSample.wdl:391:9: warning[UnusedInput]: unused input `max_retries`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/somatic/single_sample/wgs/gdc_genome/GDCWholeGenomeSomaticSingleSample.wdl/#L391" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/somatic/single_sample/wgs/gdc_genome/GDCWholeGenomeSomaticSingleSample.wdl/#L391" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/somatic/single_sample/wgs/gdc_genome/GDCWholeGenomeSomaticSingleSample.wdl" message = "GDCWholeGenomeSomaticSingleSample.wdl:626:12: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/somatic/single_sample/wgs/gdc_genome/GDCWholeGenomeSomaticSingleSample.wdl/#L626" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/somatic/single_sample/wgs/gdc_genome/GDCWholeGenomeSomaticSingleSample.wdl/#L626" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/somatic/single_sample/wgs/gdc_genome/GDCWholeGenomeSomaticSingleSample.wdl" message = "GDCWholeGenomeSomaticSingleSample.wdl:666:40: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/somatic/single_sample/wgs/gdc_genome/GDCWholeGenomeSomaticSingleSample.wdl/#L666" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/somatic/single_sample/wgs/gdc_genome/GDCWholeGenomeSomaticSingleSample.wdl/#L666" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/dna_seq/somatic/single_sample/wgs/gdc_genome/GDCWholeGenomeSomaticSingleSample.wdl" message = "GDCWholeGenomeSomaticSingleSample.wdl:672:14: error: conflicting scatter variable name `ubam`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/dna_seq/somatic/single_sample/wgs/gdc_genome/GDCWholeGenomeSomaticSingleSample.wdl/#L672" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/dna_seq/somatic/single_sample/wgs/gdc_genome/GDCWholeGenomeSomaticSingleSample.wdl/#L672" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/internal/arrays/imputation/BroadInternalImputation.wdl" message = "BroadInternalImputation.wdl:12:12: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/internal/arrays/imputation/BroadInternalImputation.wdl/#L12" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/internal/arrays/imputation/BroadInternalImputation.wdl/#L12" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/internal/arrays/imputation/BroadInternalImputation.wdl" message = "BroadInternalImputation.wdl:81:34: warning[UnusedCall]: unused call `TriggerPrsWithImputationTsv`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/internal/arrays/imputation/BroadInternalImputation.wdl/#L81" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/internal/arrays/imputation/BroadInternalImputation.wdl/#L81" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/internal/arrays/single_sample/BroadInternalArrays.wdl" message = "BroadInternalArrays.wdl:12:12: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/internal/arrays/single_sample/BroadInternalArrays.wdl/#L12" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/internal/arrays/single_sample/BroadInternalArrays.wdl/#L12" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/internal/arrays/single_sample/BroadInternalArrays.wdl" message = "BroadInternalArrays.wdl:80:24: warning[UnusedCall]: unused call `IngestOutputsToTDR`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/internal/arrays/single_sample/BroadInternalArrays.wdl/#L80" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/internal/arrays/single_sample/BroadInternalArrays.wdl/#L80" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl" message = "BroadInternalUltimaGenomics.wdl:4:95: warning[UnusedImport]: unused import namespace `Structs`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl/#L4" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl/#L4" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl" message = "BroadInternalUltimaGenomics.wdl:63:25: error: type mismatch: expected type `Array[File]`, but found type `Array[File]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl/#L63" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl/#L63" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl" message = "BroadInternalUltimaGenomics.wdl:64:24: error: type mismatch: expected type `Array[File]`, but found type `Array[File]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl/#L64" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl/#L64" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl" message = "BroadInternalUltimaGenomics.wdl:91:34: error: type mismatch: argument to function `select_first` expects type `Array[X]` where `X`: any optional type, but found type `Array[File]+`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl/#L91" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl/#L91" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl" message = "BroadInternalUltimaGenomics.wdl:92:48: error: type mismatch: argument to function `select_first` expects type `Array[X]` where `X`: any optional type, but found type `Array[File]+`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl/#L92" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl/#L92" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl" message = "BroadInternalUltimaGenomics.wdl:93:46: error: type mismatch: argument to function `select_first` expects type `Array[X]` where `X`: any optional type, but found type `Array[File]+`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl/#L93" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl/#L93" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl" message = "BroadInternalUltimaGenomics.wdl:94:40: error: type mismatch: argument to function `select_first` expects type `Array[X]` where `X`: any optional type, but found type `Array[File]+`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl/#L94" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl/#L94" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl" message = "BroadInternalUltimaGenomics.wdl:95:44: error: type mismatch: argument to function `select_first` expects type `Array[X]` where `X`: any optional type, but found type `Array[File]+`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl/#L95" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl/#L95" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl" message = "BroadInternalUltimaGenomics.wdl:96:38: error: type mismatch: argument to function `select_first` expects type `Array[X]` where `X`: any optional type, but found type `Array[File]+`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl/#L96" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl/#L96" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl" message = "BroadInternalUltimaGenomics.wdl:97:44: error: type mismatch: argument to function `select_first` expects type `Array[X]` where `X`: any optional type, but found type `Array[File]+`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl/#L97" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl/#L97" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl" message = "BroadInternalUltimaGenomics.wdl:9:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl/#L9" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/internal/dna_seq/germline/single_sample/UltimaGenomics/BroadInternalUltimaGenomics.wdl/#L9" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/internal/rna_seq/BroadInternalRNAWithUMIs.wdl" message = "BroadInternalRNAWithUMIs.wdl:10:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/internal/rna_seq/BroadInternalRNAWithUMIs.wdl/#L10" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/internal/rna_seq/BroadInternalRNAWithUMIs.wdl/#L10" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/internal/rna_seq/BroadInternalRNAWithUMIs.wdl" message = "BroadInternalRNAWithUMIs.wdl:160:45: error: type mismatch: expected type `String`, but found type `Float`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/internal/rna_seq/BroadInternalRNAWithUMIs.wdl/#L160" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/internal/rna_seq/BroadInternalRNAWithUMIs.wdl/#L160" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/qc/CheckFingerprint.wdl" message = "CheckFingerprint.wdl:27:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/qc/CheckFingerprint.wdl/#L27" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/qc/CheckFingerprint.wdl/#L27" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/reprocessing/cram_to_unmapped_bams/CramToUnmappedBams.wdl" message = "CramToUnmappedBams.wdl:12:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/reprocessing/cram_to_unmapped_bams/CramToUnmappedBams.wdl/#L12" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/reprocessing/cram_to_unmapped_bams/CramToUnmappedBams.wdl/#L12" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/reprocessing/cram_to_unmapped_bams/CramToUnmappedBams.wdl" message = "CramToUnmappedBams.wdl:20:12: warning[UnusedInput]: unused input `base_file_name`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/reprocessing/cram_to_unmapped_bams/CramToUnmappedBams.wdl/#L20" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/reprocessing/cram_to_unmapped_bams/CramToUnmappedBams.wdl/#L20" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/reprocessing/exome/ExomeReprocessing.wdl" message = "ExomeReprocessing.wdl:10:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/reprocessing/exome/ExomeReprocessing.wdl/#L10" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/reprocessing/exome/ExomeReprocessing.wdl/#L10" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/reprocessing/exome/ExomeReprocessing.wdl" message = "ExomeReprocessing.wdl:5:8: warning[UnusedImport]: unused import namespace `DNASeqStructs`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/reprocessing/exome/ExomeReprocessing.wdl/#L5" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/reprocessing/exome/ExomeReprocessing.wdl/#L5" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/reprocessing/external/exome/ExternalExomeReprocessing.wdl" message = "ExternalExomeReprocessing.wdl:62:13: warning[UnusedCall]: unused call `CopyFilesFromCloudToCloud`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/reprocessing/external/exome/ExternalExomeReprocessing.wdl/#L62" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/reprocessing/external/exome/ExternalExomeReprocessing.wdl/#L62" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/reprocessing/external/exome/ExternalExomeReprocessing.wdl" message = "ExternalExomeReprocessing.wdl:8:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/reprocessing/external/exome/ExternalExomeReprocessing.wdl/#L8" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/reprocessing/external/exome/ExternalExomeReprocessing.wdl/#L8" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/reprocessing/external/wgs/ExternalWholeGenomeReprocessing.wdl" message = "ExternalWholeGenomeReprocessing.wdl:60:13: warning[UnusedCall]: unused call `CopyFilesFromCloudToCloud`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/reprocessing/external/wgs/ExternalWholeGenomeReprocessing.wdl/#L60" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/reprocessing/external/wgs/ExternalWholeGenomeReprocessing.wdl/#L60" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/reprocessing/external/wgs/ExternalWholeGenomeReprocessing.wdl" message = "ExternalWholeGenomeReprocessing.wdl:9:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/reprocessing/external/wgs/ExternalWholeGenomeReprocessing.wdl/#L9" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/reprocessing/external/wgs/ExternalWholeGenomeReprocessing.wdl/#L9" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/reprocessing/wgs/WholeGenomeReprocessing.wdl" message = "WholeGenomeReprocessing.wdl:5:8: warning[UnusedImport]: unused import namespace `DNASeqStructs`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/reprocessing/wgs/WholeGenomeReprocessing.wdl/#L5" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/reprocessing/wgs/WholeGenomeReprocessing.wdl/#L5" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/reprocessing/wgs/WholeGenomeReprocessing.wdl" message = "WholeGenomeReprocessing.wdl:9:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/reprocessing/wgs/WholeGenomeReprocessing.wdl/#L9" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/reprocessing/wgs/WholeGenomeReprocessing.wdl/#L9" [[diagnostics]] document = "broadinstitute/warp:/pipelines/broad/rna_seq/RNAWithUMIsPipeline.wdl" message = "RNAWithUMIsPipeline.wdl:23:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/broad/rna_seq/RNAWithUMIsPipeline.wdl/#L23" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/broad/rna_seq/RNAWithUMIsPipeline.wdl/#L23" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/atac/atac.wdl" message = "atac.wdl:145:25: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/atac/atac.wdl/#L145" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/atac/atac.wdl/#L145" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/atac/atac.wdl" message = "atac.wdl:158:25: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/atac/atac.wdl/#L158" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/atac/atac.wdl/#L158" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/atac/atac.wdl" message = "atac.wdl:3:52: warning[UnusedImport]: unused import namespace `Merge`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/atac/atac.wdl/#L3" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/atac/atac.wdl/#L3" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/atac/atac.wdl" message = "atac.wdl:514:10: error: conflicting input name `annotations_gtf`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/atac/atac.wdl/#L514" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/atac/atac.wdl/#L514" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/atac/atac.wdl" message = "atac.wdl:52:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/atac/atac.wdl/#L52" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/atac/atac.wdl/#L52" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/build_indices/BuildIndices.wdl" message = "BuildIndices.wdl:150:9: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/build_indices/BuildIndices.wdl/#L150" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/build_indices/BuildIndices.wdl/#L150" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/build_indices/BuildIndices.wdl" message = "BuildIndices.wdl:160:12: warning[UnusedInput]: unused input `gtf_annotation_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/build_indices/BuildIndices.wdl/#L160" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/build_indices/BuildIndices.wdl/#L160" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/build_indices/BuildIndices.wdl" message = "BuildIndices.wdl:190:10: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/build_indices/BuildIndices.wdl/#L190" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/build_indices/BuildIndices.wdl/#L190" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/build_indices/BuildIndices.wdl" message = "BuildIndices.wdl:73:10: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/build_indices/BuildIndices.wdl/#L73" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/build_indices/BuildIndices.wdl/#L73" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/multiome/Multiome.wdl" message = "Multiome.wdl:105:13: error: duplicate call input `cloud_provider` in call statement" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/multiome/Multiome.wdl/#L105" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/multiome/Multiome.wdl/#L105" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/multiome/Multiome.wdl" message = "Multiome.wdl:90:24: error: type mismatch: expected type `Array[File]`, but found type `Array[File]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/multiome/Multiome.wdl/#L90" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/multiome/Multiome.wdl/#L90" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/optimus/Optimus.wdl" -message = "Optimus.wdl:163:18: error: type mismatch: expected type `Array[File]`, but found type `Array[File]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/optimus/Optimus.wdl/#L163" +message = "Optimus.wdl:164:18: error: type mismatch: expected type `Array[File]`, but found type `Array[File]?`" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/optimus/Optimus.wdl/#L164" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/optimus/Optimus.wdl" -message = "Optimus.wdl:227:22: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/optimus/Optimus.wdl/#L227" +message = "Optimus.wdl:228:22: error: type mismatch: expected type `String`, but found type `String?`" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/optimus/Optimus.wdl/#L228" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/optimus/Optimus.wdl" -message = "Optimus.wdl:276:24: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/optimus/Optimus.wdl/#L276" +message = "Optimus.wdl:277:24: error: type mismatch: expected type `String`, but found type `String?`" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/optimus/Optimus.wdl/#L277" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/optimus/Optimus.wdl" message = "Optimus.wdl:78:14: warning[UnusedDeclaration]: unused declaration `indices`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/optimus/Optimus.wdl/#L78" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/optimus/Optimus.wdl/#L78" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/optimus/Optimus.wdl" message = "Optimus.wdl:91:10: warning[UnusedDeclaration]: unused declaration `pytools_docker`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/optimus/Optimus.wdl/#L91" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/optimus/Optimus.wdl/#L91" + +[[diagnostics]] +document = "broadinstitute/warp:/pipelines/skylab/optimus/Optimus.wdl" +message = "Optimus.wdl:93:10: warning[UnusedDeclaration]: unused declaration `star_docker`" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/optimus/Optimus.wdl/#L93" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/paired_tag/PairedTag.wdl" message = "PairedTag.wdl:5:49: warning[UnusedImport]: unused import namespace `H5adUtils`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/paired_tag/PairedTag.wdl/#L5" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/paired_tag/PairedTag.wdl/#L5" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/paired_tag/PairedTag.wdl" message = "PairedTag.wdl:86:24: error: type mismatch: expected type `Array[File]`, but found type `Array[File]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/paired_tag/PairedTag.wdl/#L86" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/paired_tag/PairedTag.wdl/#L86" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/scATAC/scATAC.wdl" message = "scATAC.wdl:203:9: error: duplicate key `cpu` in runtime section" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/scATAC/scATAC.wdl/#L203" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/scATAC/scATAC.wdl/#L203" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/slideseq/SlideSeq.wdl" message = "SlideSeq.wdl:49:12: warning[UnusedDeclaration]: unused declaration `pytools_docker`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/slideseq/SlideSeq.wdl/#L49" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/slideseq/SlideSeq.wdl/#L49" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/slideseq/SlideSeq.wdl" message = "SlideSeq.wdl:7:51: warning[UnusedImport]: unused import namespace `OptimusInputChecks`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/slideseq/SlideSeq.wdl/#L7" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/slideseq/SlideSeq.wdl/#L7" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/slideseq/SlideSeq.wdl" message = "SlideSeq.wdl:98:24: error: type mismatch: expected type `Array[File]`, but found type `Array[File]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/slideseq/SlideSeq.wdl/#L98" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/slideseq/SlideSeq.wdl/#L98" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/smartseq2_multisample/MultiSampleSmartSeq2.wdl" message = "MultiSampleSmartSeq2.wdl:71:28: warning[UnusedCall]: unused call `checkArrays`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/smartseq2_multisample/MultiSampleSmartSeq2.wdl/#L71" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/smartseq2_multisample/MultiSampleSmartSeq2.wdl/#L71" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/smartseq2_single_nucleus_multisample/MultiSampleSmartSeq2SingleNucleus.wdl" message = "MultiSampleSmartSeq2SingleNucleus.wdl:135:27: error: type mismatch: expected type `Array[String]`, but found type `Array[String]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/smartseq2_single_nucleus_multisample/MultiSampleSmartSeq2SingleNucleus.wdl/#L135" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/smartseq2_single_nucleus_multisample/MultiSampleSmartSeq2SingleNucleus.wdl/#L135" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/smartseq2_single_nucleus_multisample/MultiSampleSmartSeq2SingleNucleus.wdl" message = "MultiSampleSmartSeq2SingleNucleus.wdl:34:15: warning[UnusedInput]: unused input `batch_name`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/smartseq2_single_nucleus_multisample/MultiSampleSmartSeq2SingleNucleus.wdl/#L34" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/smartseq2_single_nucleus_multisample/MultiSampleSmartSeq2SingleNucleus.wdl/#L34" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/smartseq2_single_nucleus_multisample/MultiSampleSmartSeq2SingleNucleus.wdl" message = "MultiSampleSmartSeq2SingleNucleus.wdl:35:22: warning[UnusedInput]: unused input `project_id`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/smartseq2_single_nucleus_multisample/MultiSampleSmartSeq2SingleNucleus.wdl/#L35" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/smartseq2_single_nucleus_multisample/MultiSampleSmartSeq2SingleNucleus.wdl/#L35" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/smartseq2_single_nucleus_multisample/MultiSampleSmartSeq2SingleNucleus.wdl" message = "MultiSampleSmartSeq2SingleNucleus.wdl:36:22: warning[UnusedInput]: unused input `project_name`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/smartseq2_single_nucleus_multisample/MultiSampleSmartSeq2SingleNucleus.wdl/#L36" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/smartseq2_single_nucleus_multisample/MultiSampleSmartSeq2SingleNucleus.wdl/#L36" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/smartseq2_single_nucleus_multisample/MultiSampleSmartSeq2SingleNucleus.wdl" message = "MultiSampleSmartSeq2SingleNucleus.wdl:37:22: warning[UnusedInput]: unused input `library`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/smartseq2_single_nucleus_multisample/MultiSampleSmartSeq2SingleNucleus.wdl/#L37" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/smartseq2_single_nucleus_multisample/MultiSampleSmartSeq2SingleNucleus.wdl/#L37" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/smartseq2_single_nucleus_multisample/MultiSampleSmartSeq2SingleNucleus.wdl" message = "MultiSampleSmartSeq2SingleNucleus.wdl:38:22: warning[UnusedInput]: unused input `species`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/smartseq2_single_nucleus_multisample/MultiSampleSmartSeq2SingleNucleus.wdl/#L38" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/smartseq2_single_nucleus_multisample/MultiSampleSmartSeq2SingleNucleus.wdl/#L38" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/smartseq2_single_nucleus_multisample/MultiSampleSmartSeq2SingleNucleus.wdl" message = "MultiSampleSmartSeq2SingleNucleus.wdl:39:22: warning[UnusedInput]: unused input `organ`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/smartseq2_single_nucleus_multisample/MultiSampleSmartSeq2SingleNucleus.wdl/#L39" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/smartseq2_single_nucleus_multisample/MultiSampleSmartSeq2SingleNucleus.wdl/#L39" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/smartseq2_single_nucleus_multisample/MultiSampleSmartSeq2SingleNucleus.wdl" message = "MultiSampleSmartSeq2SingleNucleus.wdl:81:40: warning[UnusedCall]: unused call `checkArrays`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/smartseq2_single_nucleus_multisample/MultiSampleSmartSeq2SingleNucleus.wdl/#L81" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/smartseq2_single_nucleus_multisample/MultiSampleSmartSeq2SingleNucleus.wdl/#L81" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/smartseq2_single_nucleus_multisample/MultiSampleSmartSeq2SingleNucleus.wdl" message = "MultiSampleSmartSeq2SingleNucleus.wdl:84:24: error: type mismatch: expected type `Array[String]`, but found type `Array[String]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/smartseq2_single_nucleus_multisample/MultiSampleSmartSeq2SingleNucleus.wdl/#L84" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/smartseq2_single_nucleus_multisample/MultiSampleSmartSeq2SingleNucleus.wdl/#L84" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/snm3C/snm3C.wdl" message = "snm3C.wdl:278:14: warning[UnusedInput]: unused input `chromosome_sizes`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/snm3C/snm3C.wdl/#L278" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/snm3C/snm3C.wdl/#L278" [[diagnostics]] document = "broadinstitute/warp:/pipelines/skylab/snm3C/snm3C.wdl" message = "snm3C.wdl:47:12: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/pipelines/skylab/snm3C/snm3C.wdl/#L47" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/pipelines/skylab/snm3C/snm3C.wdl/#L47" [[diagnostics]] document = "broadinstitute/warp:/projects/optimus/CreateOptimusAdapterMetadata.wdl" message = "CreateOptimusAdapterMetadata.wdl:131:72: error: type mismatch: argument to function `select_all` expects type `Array[X]` where `X`: any optional type, but found type `Array[Array[File]]`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/projects/optimus/CreateOptimusAdapterMetadata.wdl/#L131" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/projects/optimus/CreateOptimusAdapterMetadata.wdl/#L131" [[diagnostics]] document = "broadinstitute/warp:/projects/optimus/CreateOptimusAdapterMetadata.wdl" message = "CreateOptimusAdapterMetadata.wdl:217:14: warning[UnusedCall]: unused call `ValidateStagingArea`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/projects/optimus/CreateOptimusAdapterMetadata.wdl/#L217" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/projects/optimus/CreateOptimusAdapterMetadata.wdl/#L217" [[diagnostics]] document = "broadinstitute/warp:/projects/optimus/CreateOptimusAdapterMetadata.wdl" message = "CreateOptimusAdapterMetadata.wdl:45:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/projects/optimus/CreateOptimusAdapterMetadata.wdl/#L45" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/projects/optimus/CreateOptimusAdapterMetadata.wdl/#L45" [[diagnostics]] document = "broadinstitute/warp:/projects/smartseq2/CreateSs2AdapterMetadata.wdl" message = "CreateSs2AdapterMetadata.wdl:141:73: error: type mismatch: argument to function `select_all` expects type `Array[X]` where `X`: any optional type, but found type `Array[Array[File]]`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/projects/smartseq2/CreateSs2AdapterMetadata.wdl/#L141" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/projects/smartseq2/CreateSs2AdapterMetadata.wdl/#L141" [[diagnostics]] document = "broadinstitute/warp:/projects/smartseq2/CreateSs2AdapterMetadata.wdl" message = "CreateSs2AdapterMetadata.wdl:142:72: error: type mismatch: argument to function `select_all` expects type `Array[X]` where `X`: any optional type, but found type `Array[Array[File]]`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/projects/smartseq2/CreateSs2AdapterMetadata.wdl/#L142" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/projects/smartseq2/CreateSs2AdapterMetadata.wdl/#L142" [[diagnostics]] document = "broadinstitute/warp:/projects/smartseq2/CreateSs2AdapterMetadata.wdl" message = "CreateSs2AdapterMetadata.wdl:143:72: error: type mismatch: argument to function `select_all` expects type `Array[X]` where `X`: any optional type, but found type `Array[Array[File]]`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/projects/smartseq2/CreateSs2AdapterMetadata.wdl/#L143" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/projects/smartseq2/CreateSs2AdapterMetadata.wdl/#L143" [[diagnostics]] document = "broadinstitute/warp:/projects/smartseq2/CreateSs2AdapterMetadata.wdl" message = "CreateSs2AdapterMetadata.wdl:175:68: error: type mismatch: argument to function `select_all` expects type `Array[X]` where `X`: any optional type, but found type `Array[Array[File]]+`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/projects/smartseq2/CreateSs2AdapterMetadata.wdl/#L175" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/projects/smartseq2/CreateSs2AdapterMetadata.wdl/#L175" [[diagnostics]] document = "broadinstitute/warp:/projects/smartseq2/CreateSs2AdapterMetadata.wdl" message = "CreateSs2AdapterMetadata.wdl:231:14: warning[UnusedCall]: unused call `ValidateStagingArea`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/projects/smartseq2/CreateSs2AdapterMetadata.wdl/#L231" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/projects/smartseq2/CreateSs2AdapterMetadata.wdl/#L231" [[diagnostics]] document = "broadinstitute/warp:/projects/smartseq2/CreateSs2AdapterMetadata.wdl" message = "CreateSs2AdapterMetadata.wdl:42:10: warning[UnusedDeclaration]: unused declaration `pipeline_version`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/projects/smartseq2/CreateSs2AdapterMetadata.wdl/#L42" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/projects/smartseq2/CreateSs2AdapterMetadata.wdl/#L42" [[diagnostics]] document = "broadinstitute/warp:/projects/smartseq2/CreateSs2AdapterMetadata.wdl" message = "CreateSs2AdapterMetadata.wdl:90:10: warning[UnusedDeclaration]: unused declaration `project_name`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/projects/smartseq2/CreateSs2AdapterMetadata.wdl/#L90" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/projects/smartseq2/CreateSs2AdapterMetadata.wdl/#L90" [[diagnostics]] document = "broadinstitute/warp:/projects/tasks/AdapterTasks.wdl" message = "AdapterTasks.wdl:580:13: warning[UnusedInput]: unused input `cache_invalidate`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/projects/tasks/AdapterTasks.wdl/#L580" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/projects/tasks/AdapterTasks.wdl/#L580" [[diagnostics]] document = "broadinstitute/warp:/projects/tasks/AdapterTasks.wdl" message = "AdapterTasks.wdl:738:13: warning[UnusedInput]: unused input `done`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/projects/tasks/AdapterTasks.wdl/#L738" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/projects/tasks/AdapterTasks.wdl/#L738" [[diagnostics]] document = "broadinstitute/warp:/projects/tasks/CreateReferenceMetadata.wdl" message = "CreateReferenceMetadata.wdl:15:12: warning[UnusedInput]: unused input `input_type`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/projects/tasks/CreateReferenceMetadata.wdl/#L15" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/projects/tasks/CreateReferenceMetadata.wdl/#L15" [[diagnostics]] document = "broadinstitute/warp:/scripts/BuildAFComparisonTable.wdl" message = "BuildAFComparisonTable.wdl:88:19: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/scripts/BuildAFComparisonTable.wdl/#L88" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/scripts/BuildAFComparisonTable.wdl/#L88" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/AggregatedBamQC.wdl" message = "AggregatedBamQC.wdl:60:15: error: type mismatch: argument to function `defined` expects type `X` where `X`: any optional type, but found type `File`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/AggregatedBamQC.wdl/#L60" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/AggregatedBamQC.wdl/#L60" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/Alignment.wdl" message = "Alignment.wdl:119:10: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/Alignment.wdl/#L119" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/Alignment.wdl/#L119" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/BamProcessing.wdl" message = "BamProcessing.wdl:53:10: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/BamProcessing.wdl/#L53" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/BamProcessing.wdl/#L53" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/CopyFilesFromCloudToCloud.wdl" message = "CopyFilesFromCloudToCloud.wdl:71:10: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/CopyFilesFromCloudToCloud.wdl/#L71" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/CopyFilesFromCloudToCloud.wdl/#L71" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/Funcotator.wdl" message = "Funcotator.wdl:163:118: error: cannot coerce type `Array[String]?` to `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/Funcotator.wdl/#L163" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/Funcotator.wdl/#L163" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/Funcotator.wdl" message = "Funcotator.wdl:163:92: error: a placeholder cannot have more than one option" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/Funcotator.wdl/#L163" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/Funcotator.wdl/#L163" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/Funcotator.wdl" message = "Funcotator.wdl:164:118: error: cannot coerce type `Array[String]?` to `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/Funcotator.wdl/#L164" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/Funcotator.wdl/#L164" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/Funcotator.wdl" message = "Funcotator.wdl:164:89: error: a placeholder cannot have more than one option" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/Funcotator.wdl/#L164" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/Funcotator.wdl/#L164" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/Funcotator.wdl" message = "Funcotator.wdl:165:121: error: cannot coerce type `Array[String]?` to `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/Funcotator.wdl/#L165" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/Funcotator.wdl/#L165" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/Funcotator.wdl" message = "Funcotator.wdl:165:91: error: a placeholder cannot have more than one option" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/Funcotator.wdl/#L165" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/Funcotator.wdl/#L165" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/GermlineVariantDiscovery.wdl" message = "GermlineVariantDiscovery.wdl:140:32: error: expected string, but found integer" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/GermlineVariantDiscovery.wdl/#L140" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/GermlineVariantDiscovery.wdl/#L140" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/GermlineVariantDiscovery.wdl" message = "GermlineVariantDiscovery.wdl:157:10: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/GermlineVariantDiscovery.wdl/#L157" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/GermlineVariantDiscovery.wdl/#L157" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/GermlineVariantDiscovery.wdl" message = "GermlineVariantDiscovery.wdl:27:12: warning[UnusedInput]: unused input `contamination`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/GermlineVariantDiscovery.wdl/#L27" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/GermlineVariantDiscovery.wdl/#L27" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/GermlineVariantDiscovery.wdl" message = "GermlineVariantDiscovery.wdl:335:12: warning[UnusedInput]: unused input `vcf_basename`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/GermlineVariantDiscovery.wdl/#L335" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/GermlineVariantDiscovery.wdl/#L335" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/GermlineVariantDiscovery.wdl" message = "GermlineVariantDiscovery.wdl:373:10: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/GermlineVariantDiscovery.wdl/#L373" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/GermlineVariantDiscovery.wdl/#L373" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/GermlineVariantDiscovery.wdl" message = "GermlineVariantDiscovery.wdl:429:10: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/GermlineVariantDiscovery.wdl/#L429" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/GermlineVariantDiscovery.wdl/#L429" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/GermlineVariantDiscovery.wdl" message = "GermlineVariantDiscovery.wdl:67:32: error: expected string, but found integer" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/GermlineVariantDiscovery.wdl/#L67" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/GermlineVariantDiscovery.wdl/#L67" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/GermlineVariantDiscovery.wdl" message = "GermlineVariantDiscovery.wdl:74:10: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/GermlineVariantDiscovery.wdl/#L74" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/GermlineVariantDiscovery.wdl/#L74" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/GermlineVariantDiscovery.wdl" message = "GermlineVariantDiscovery.wdl:92:12: warning[UnusedInput]: unused input `contamination`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/GermlineVariantDiscovery.wdl/#L92" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/GermlineVariantDiscovery.wdl/#L92" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/GermlineVariantDiscovery.wdl" message = "GermlineVariantDiscovery.wdl:98:13: warning[UnusedInput]: unused input `use_dragen_hard_filtering`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/GermlineVariantDiscovery.wdl/#L98" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/GermlineVariantDiscovery.wdl/#L98" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/IlluminaGenotypingArrayTasks.wdl" message = "IlluminaGenotypingArrayTasks.wdl:109:11: warning[UnusedInput]: unused input `fingerprint_genotypes_vcf_index_file`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/IlluminaGenotypingArrayTasks.wdl/#L109" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/IlluminaGenotypingArrayTasks.wdl/#L109" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/IlluminaGenotypingArrayTasks.wdl" message = "IlluminaGenotypingArrayTasks.wdl:214:10: warning[UnusedInput]: unused input `input_vcf`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/IlluminaGenotypingArrayTasks.wdl/#L214" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/IlluminaGenotypingArrayTasks.wdl/#L214" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/IlluminaGenotypingArrayTasks.wdl" message = "IlluminaGenotypingArrayTasks.wdl:287:10: warning[UnusedInput]: unused input `input_vcf_index_file`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/IlluminaGenotypingArrayTasks.wdl/#L287" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/IlluminaGenotypingArrayTasks.wdl/#L287" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/IlluminaGenotypingArrayTasks.wdl" message = "IlluminaGenotypingArrayTasks.wdl:289:10: warning[UnusedInput]: unused input `dbSNP_vcf_index_file`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/IlluminaGenotypingArrayTasks.wdl/#L289" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/IlluminaGenotypingArrayTasks.wdl/#L289" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/IlluminaGenotypingArrayTasks.wdl" message = "IlluminaGenotypingArrayTasks.wdl:423:10: warning[UnusedInput]: unused input `input_vcf_index_file`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/IlluminaGenotypingArrayTasks.wdl/#L423" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/IlluminaGenotypingArrayTasks.wdl/#L423" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/IlluminaGenotypingArrayTasks.wdl" message = "IlluminaGenotypingArrayTasks.wdl:541:10: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/IlluminaGenotypingArrayTasks.wdl/#L541" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/IlluminaGenotypingArrayTasks.wdl/#L541" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/IlluminaGenotypingArrayTasks.wdl" message = "IlluminaGenotypingArrayTasks.wdl:556:10: warning[UnusedInput]: unused input `input_vcf_index_file`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/IlluminaGenotypingArrayTasks.wdl/#L556" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/IlluminaGenotypingArrayTasks.wdl/#L556" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/IlluminaGenotypingArrayTasks.wdl" message = "IlluminaGenotypingArrayTasks.wdl:591:10: warning[UnusedInput]: unused input `call_vcf_index_file`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/IlluminaGenotypingArrayTasks.wdl/#L591" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/IlluminaGenotypingArrayTasks.wdl/#L591" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/IlluminaGenotypingArrayTasks.wdl" message = "IlluminaGenotypingArrayTasks.wdl:595:11: warning[UnusedInput]: unused input `truth_vcf_index_file`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/IlluminaGenotypingArrayTasks.wdl/#L595" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/IlluminaGenotypingArrayTasks.wdl/#L595" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/IlluminaGenotypingArrayTasks.wdl" message = "IlluminaGenotypingArrayTasks.wdl:62:9: warning[UnusedInput]: unused input `disk_size`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/IlluminaGenotypingArrayTasks.wdl/#L62" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/IlluminaGenotypingArrayTasks.wdl/#L62" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/IlluminaGenotypingArrayTasks.wdl" message = "IlluminaGenotypingArrayTasks.wdl:661:10: warning[UnusedInput]: unused input `input_vcf_index_file`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/IlluminaGenotypingArrayTasks.wdl/#L661" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/IlluminaGenotypingArrayTasks.wdl/#L661" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/IlluminaGenotypingArrayTasks.wdl" message = "IlluminaGenotypingArrayTasks.wdl:698:10: warning[UnusedInput]: unused input `dbSNP_vcf_index_file`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/IlluminaGenotypingArrayTasks.wdl/#L698" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/IlluminaGenotypingArrayTasks.wdl/#L698" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/ImputationTasks.wdl" message = "ImputationTasks.wdl:529:9: warning[UnusedInput]: unused input `nSamples`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/ImputationTasks.wdl/#L529" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/ImputationTasks.wdl/#L529" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/InternalArraysTasks.wdl" message = "InternalArraysTasks.wdl:42:10: warning[UnusedInput]: unused input `upload_metrics_output`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/InternalArraysTasks.wdl/#L42" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/InternalArraysTasks.wdl/#L42" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/InternalArraysTasks.wdl" message = "InternalArraysTasks.wdl:85:10: warning[UnusedInput]: unused input `input_vcf_index_file`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/InternalArraysTasks.wdl/#L85" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/InternalArraysTasks.wdl/#L85" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/InternalImputationTasks.wdl" message = "InternalImputationTasks.wdl:129:25: warning[UnusedInput]: unused input `run_task`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/InternalImputationTasks.wdl/#L129" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/InternalImputationTasks.wdl/#L129" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/InternalTasks.wdl" message = "InternalTasks.wdl:13:10: warning[UnusedDeclaration]: unused declaration `safe_name`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/InternalTasks.wdl/#L13" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/InternalTasks.wdl/#L13" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/JointGenotypingTasks.wdl" message = "JointGenotypingTasks.wdl:304:10: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/JointGenotypingTasks.wdl/#L304" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/JointGenotypingTasks.wdl/#L304" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/JointGenotypingTasks.wdl" message = "JointGenotypingTasks.wdl:366:10: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/JointGenotypingTasks.wdl/#L366" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/JointGenotypingTasks.wdl/#L366" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/JointGenotypingTasks.wdl" message = "JointGenotypingTasks.wdl:434:10: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/JointGenotypingTasks.wdl/#L434" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/JointGenotypingTasks.wdl/#L434" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/JointGenotypingTasks.wdl" message = "JointGenotypingTasks.wdl:49:13: warning[UnusedInput]: unused input `sample_names_unique_done`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/JointGenotypingTasks.wdl/#L49" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/JointGenotypingTasks.wdl/#L49" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/JointGenotypingTasks.wdl" message = "JointGenotypingTasks.wdl:581:10: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/JointGenotypingTasks.wdl/#L581" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/JointGenotypingTasks.wdl/#L581" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/JointGenotypingTasks.wdl" message = "JointGenotypingTasks.wdl:641:10: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/JointGenotypingTasks.wdl/#L641" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/JointGenotypingTasks.wdl/#L641" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/JointGenotypingTasks.wdl" message = "JointGenotypingTasks.wdl:688:10: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/JointGenotypingTasks.wdl/#L688" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/JointGenotypingTasks.wdl/#L688" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/JointGenotypingTasks.wdl" message = "JointGenotypingTasks.wdl:859:10: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/JointGenotypingTasks.wdl/#L859" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/JointGenotypingTasks.wdl/#L859" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/JointGenotypingTasks.wdl" message = "JointGenotypingTasks.wdl:87:10: warning[UnusedInput]: unused input `ref_fasta`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/JointGenotypingTasks.wdl/#L87" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/JointGenotypingTasks.wdl/#L87" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/JointGenotypingTasks.wdl" message = "JointGenotypingTasks.wdl:900:16: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/JointGenotypingTasks.wdl/#L900" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/JointGenotypingTasks.wdl/#L900" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/Qc.wdl" message = "Qc.wdl:434:31: error: a placeholder cannot have more than one option" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/Qc.wdl/#L434" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/Qc.wdl/#L434" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/Qc.wdl" message = "Qc.wdl:434:46: error: cannot coerce type `Array[String]?` to `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/Qc.wdl/#L434" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/Qc.wdl/#L434" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/Qc.wdl" message = "Qc.wdl:436:46: error: a placeholder cannot have more than one option" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/Qc.wdl/#L436" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/Qc.wdl/#L436" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/Qc.wdl" message = "Qc.wdl:506:29: error: type mismatch: expected type `String`, but found type `Int`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/Qc.wdl/#L506" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/Qc.wdl/#L506" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/RNAWithUMIsTasks.wdl" message = "RNAWithUMIsTasks.wdl:935:12: warning[UnusedInput]: unused input `mem`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/RNAWithUMIsTasks.wdl/#L935" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/RNAWithUMIsTasks.wdl/#L935" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/SplitLargeReadGroup.wdl" message = "SplitLargeReadGroup.wdl:21:45: warning[UnusedImport]: unused import namespace `Utils`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/SplitLargeReadGroup.wdl/#L21" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/SplitLargeReadGroup.wdl/#L21" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/SplitLargeReadGroup.wdl" message = "SplitLargeReadGroup.wdl:22:53: warning[UnusedImport]: unused import namespace `Structs`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/SplitLargeReadGroup.wdl/#L22" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/SplitLargeReadGroup.wdl/#L22" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/UltimaGenomicsGermlineFilteringThreshold.wdl" message = "UltimaGenomicsGermlineFilteringThreshold.wdl:228:11: warning[UnusedInput]: unused input `interval_list`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/UltimaGenomicsGermlineFilteringThreshold.wdl/#L228" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/UltimaGenomicsGermlineFilteringThreshold.wdl/#L228" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/UltimaGenomicsWholeGenomeGermlineAlignmentMarkDuplicates.wdl" message = "UltimaGenomicsWholeGenomeGermlineAlignmentMarkDuplicates.wdl:14:11: warning[UnusedInput]: unused input `rsq_threshold`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/UltimaGenomicsWholeGenomeGermlineAlignmentMarkDuplicates.wdl/#L14" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/UltimaGenomicsWholeGenomeGermlineAlignmentMarkDuplicates.wdl/#L14" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/UltimaGenomicsWholeGenomeGermlineAlignmentMarkDuplicates.wdl" message = "UltimaGenomicsWholeGenomeGermlineAlignmentMarkDuplicates.wdl:5:80: warning[UnusedImport]: unused import namespace `Structs`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/UltimaGenomicsWholeGenomeGermlineAlignmentMarkDuplicates.wdl/#L5" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/UltimaGenomicsWholeGenomeGermlineAlignmentMarkDuplicates.wdl/#L5" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/UltimaGenomicsWholeGenomeGermlineAlignmentMarkDuplicates.wdl" message = "UltimaGenomicsWholeGenomeGermlineAlignmentMarkDuplicates.wdl:65:7: warning[UnusedDeclaration]: unused declaration `rounded_disk_size`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/UltimaGenomicsWholeGenomeGermlineAlignmentMarkDuplicates.wdl/#L65" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/UltimaGenomicsWholeGenomeGermlineAlignmentMarkDuplicates.wdl/#L65" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/UltimaGenomicsWholeGenomeGermlineTasks.wdl" message = "UltimaGenomicsWholeGenomeGermlineTasks.wdl:1096:12: warning[UnusedInput]: unused input `annotation`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/UltimaGenomicsWholeGenomeGermlineTasks.wdl/#L1096" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/UltimaGenomicsWholeGenomeGermlineTasks.wdl/#L1096" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/UltimaGenomicsWholeGenomeGermlineTasks.wdl" message = "UltimaGenomicsWholeGenomeGermlineTasks.wdl:63:9: warning[UnusedInput]: unused input `preemptible`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/UltimaGenomicsWholeGenomeGermlineTasks.wdl/#L63" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/UltimaGenomicsWholeGenomeGermlineTasks.wdl/#L63" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/UltimaGenomicsWholeGenomeGermlineTasks.wdl" message = "UltimaGenomicsWholeGenomeGermlineTasks.wdl:785:10: warning[UnusedInput]: unused input `read_length`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/UltimaGenomicsWholeGenomeGermlineTasks.wdl/#L785" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/UltimaGenomicsWholeGenomeGermlineTasks.wdl/#L785" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/UltimaGenomicsWholeGenomeGermlineTasks.wdl" message = "UltimaGenomicsWholeGenomeGermlineTasks.wdl:786:11: warning[UnusedInput]: unused input `jar_override`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/UltimaGenomicsWholeGenomeGermlineTasks.wdl/#L786" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/UltimaGenomicsWholeGenomeGermlineTasks.wdl/#L786" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/UltimaGenomicsWholeGenomeGermlineTasks.wdl" message = "UltimaGenomicsWholeGenomeGermlineTasks.wdl:814:27: error: expected string, but found integer" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/UltimaGenomicsWholeGenomeGermlineTasks.wdl/#L814" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/UltimaGenomicsWholeGenomeGermlineTasks.wdl/#L814" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/UltimaGenomicsWholeGenomeGermlineTasks.wdl" message = "UltimaGenomicsWholeGenomeGermlineTasks.wdl:839:10: warning[UnusedInput]: unused input `read_length`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/UltimaGenomicsWholeGenomeGermlineTasks.wdl/#L839" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/UltimaGenomicsWholeGenomeGermlineTasks.wdl/#L839" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/UltimaGenomicsWholeGenomeGermlineTasks.wdl" message = "UltimaGenomicsWholeGenomeGermlineTasks.wdl:866:27: error: expected string, but found integer" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/UltimaGenomicsWholeGenomeGermlineTasks.wdl/#L866" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/UltimaGenomicsWholeGenomeGermlineTasks.wdl/#L866" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/UnmappedBamToAlignedBam.wdl" message = "UnmappedBamToAlignedBam.wdl:168:15: error: type mismatch: argument to function `defined` expects type `X` where `X`: any optional type, but found type `File`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/UnmappedBamToAlignedBam.wdl/#L168" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/UnmappedBamToAlignedBam.wdl/#L168" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/UnmappedBamToAlignedBam.wdl" message = "UnmappedBamToAlignedBam.wdl:25:53: warning[UnusedImport]: unused import namespace `Structs`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/UnmappedBamToAlignedBam.wdl/#L25" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/UnmappedBamToAlignedBam.wdl/#L25" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/UnmappedBamToAlignedBam.wdl" message = "UnmappedBamToAlignedBam.wdl:85:31: error: type mismatch: expected type `DragmapReference`, but found type `DragmapReference?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/UnmappedBamToAlignedBam.wdl/#L85" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/UnmappedBamToAlignedBam.wdl/#L85" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/Utilities.wdl" message = "Utilities.wdl:152:10: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/Utilities.wdl/#L152" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/Utilities.wdl/#L152" [[diagnostics]] document = "broadinstitute/warp:/tasks/broad/Utilities.wdl" message = "Utilities.wdl:183:10: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/broad/Utilities.wdl/#L183" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/broad/Utilities.wdl/#L183" [[diagnostics]] document = "broadinstitute/warp:/tasks/skylab/FastqProcessing.wdl" message = "FastqProcessing.wdl:243:16: warning[UnusedInput]: unused input `barcode_orientation`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/skylab/FastqProcessing.wdl/#L243" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/skylab/FastqProcessing.wdl/#L243" [[diagnostics]] document = "broadinstitute/warp:/tasks/skylab/H5adUtils.wdl" message = "H5adUtils.wdl:119:10: error: conflicting output name `library_metrics`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/skylab/H5adUtils.wdl/#L119" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/skylab/H5adUtils.wdl/#L119" [[diagnostics]] document = "broadinstitute/warp:/tasks/skylab/H5adUtils.wdl" message = "H5adUtils.wdl:224:14: error: conflicting output name `library_metrics`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/skylab/H5adUtils.wdl/#L224" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/skylab/H5adUtils.wdl/#L224" [[diagnostics]] document = "broadinstitute/warp:/tasks/skylab/H5adUtils.wdl" message = "H5adUtils.wdl:237:12: warning[UnusedInput]: unused input `cpuPlatform`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/skylab/H5adUtils.wdl/#L237" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/skylab/H5adUtils.wdl/#L237" [[diagnostics]] document = "broadinstitute/warp:/tasks/skylab/H5adUtils.wdl" message = "H5adUtils.wdl:35:12: error: conflicting input name `counting_mode`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/skylab/H5adUtils.wdl/#L35" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/skylab/H5adUtils.wdl/#L35" [[diagnostics]] document = "broadinstitute/warp:/tasks/skylab/H5adUtils.wdl" message = "H5adUtils.wdl:548:24: warning[UnusedInput]: unused input `input_names`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/skylab/H5adUtils.wdl/#L548" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/skylab/H5adUtils.wdl/#L548" [[diagnostics]] document = "broadinstitute/warp:/tasks/skylab/LoomUtils.wdl" message = "LoomUtils.wdl:318:24: warning[UnusedInput]: unused input `input_names`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/skylab/LoomUtils.wdl/#L318" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/skylab/LoomUtils.wdl/#L318" [[diagnostics]] document = "broadinstitute/warp:/tasks/skylab/PairedTagUtils.wdl" message = "PairedTagUtils.wdl:206:16: warning[UnusedInput]: unused input `cpuPlatform`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/skylab/PairedTagUtils.wdl/#L206" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/skylab/PairedTagUtils.wdl/#L206" [[diagnostics]] document = "broadinstitute/warp:/tasks/skylab/StarAlign.wdl" -message = "StarAlign.wdl:459:12: warning[UnusedInput]: unused input `gex_nhash_id`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/skylab/StarAlign.wdl/#L459" +message = "StarAlign.wdl:463:12: warning[UnusedInput]: unused input `gex_nhash_id`" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/skylab/StarAlign.wdl/#L463" [[diagnostics]] document = "broadinstitute/warp:/tasks/skylab/StarAlign.wdl" -message = "StarAlign.wdl:784:9: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/skylab/StarAlign.wdl/#L784" +message = "StarAlign.wdl:788:9: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/skylab/StarAlign.wdl/#L788" [[diagnostics]] document = "broadinstitute/warp:/tasks/skylab/accessory_workflows/build_bwa_reference/bwa-mk-index.wdl" message = "bwa-mk-index.wdl:24:16: warning[UnusedInput]: unused input `ref_name`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/skylab/accessory_workflows/build_bwa_reference/bwa-mk-index.wdl/#L24" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/skylab/accessory_workflows/build_bwa_reference/bwa-mk-index.wdl/#L24" [[diagnostics]] document = "broadinstitute/warp:/tasks/skylab/accessory_workflows/build_bwa_reference/bwa-mk-index.wdl" message = "bwa-mk-index.wdl:48:8: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tasks/skylab/accessory_workflows/build_bwa_reference/bwa-mk-index.wdl/#L48" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tasks/skylab/accessory_workflows/build_bwa_reference/bwa-mk-index.wdl/#L48" [[diagnostics]] document = "broadinstitute/warp:/tests/broad/scala_test/src/main/resources/dummy/dummyWorkflow.wdl" message = "dummyWorkflow.wdl:6:13: warning[UnusedInput]: unused input `dummy_int`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tests/broad/scala_test/src/main/resources/dummy/dummyWorkflow.wdl/#L6" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tests/broad/scala_test/src/main/resources/dummy/dummyWorkflow.wdl/#L6" [[diagnostics]] document = "broadinstitute/warp:/tests/broad/scala_test/src/main/resources/dummy/dummyWorkflow.wdl" message = "dummyWorkflow.wdl:7:16: warning[UnusedInput]: unused input `dummy_string`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tests/broad/scala_test/src/main/resources/dummy/dummyWorkflow.wdl/#L7" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tests/broad/scala_test/src/main/resources/dummy/dummyWorkflow.wdl/#L7" [[diagnostics]] document = "broadinstitute/warp:/tests/broad/scala_test/src/main/resources/dummy/dummyWorkflow.wdl" message = "dummyWorkflow.wdl:8:17: warning[UnusedInput]: unused input `dummy_boolean`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tests/broad/scala_test/src/main/resources/dummy/dummyWorkflow.wdl/#L8" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tests/broad/scala_test/src/main/resources/dummy/dummyWorkflow.wdl/#L8" [[diagnostics]] document = "broadinstitute/warp:/tests/broad/scala_test/src/main/resources/dummy/dummyWorkflow.wdl" message = "dummyWorkflow.wdl:9:17: warning[UnusedInput]: unused input `dummy_option`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tests/broad/scala_test/src/main/resources/dummy/dummyWorkflow.wdl/#L9" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tests/broad/scala_test/src/main/resources/dummy/dummyWorkflow.wdl/#L9" [[diagnostics]] document = "broadinstitute/warp:/tests/cemba/pr/CheckCembaOutputs.wdl" message = "CheckCembaOutputs.wdl:1:1: error: a WDL document must start with a version statement" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tests/cemba/pr/CheckCembaOutputs.wdl/#L1" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tests/cemba/pr/CheckCembaOutputs.wdl/#L1" [[diagnostics]] document = "broadinstitute/warp:/tests/skylab/scATAC/pr/test_scATAC_PR.wdl" message = "test_scATAC_PR.wdl:35:34: warning[UnusedCall]: unused call `checker`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tests/skylab/scATAC/pr/test_scATAC_PR.wdl/#L35" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tests/skylab/scATAC/pr/test_scATAC_PR.wdl/#L35" [[diagnostics]] document = "broadinstitute/warp:/tests/skylab/smartseq2_multisample/pr/test_smartseq2_multisample_PR.wdl" message = "test_smartseq2_multisample_PR.wdl:48:21: error: type mismatch: expected type `Array[String]`, but found type `Array[String]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tests/skylab/smartseq2_multisample/pr/test_smartseq2_multisample_PR.wdl/#L48" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tests/skylab/smartseq2_multisample/pr/test_smartseq2_multisample_PR.wdl/#L48" [[diagnostics]] document = "broadinstitute/warp:/tests/skylab/smartseq2_multisample/pr/test_smartseq2_multisample_PR.wdl" message = "test_smartseq2_multisample_PR.wdl:58:46: warning[UnusedCall]: unused call `checker_workflow`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tests/skylab/smartseq2_multisample/pr/test_smartseq2_multisample_PR.wdl/#L58" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tests/skylab/smartseq2_multisample/pr/test_smartseq2_multisample_PR.wdl/#L58" [[diagnostics]] document = "broadinstitute/warp:/tests/skylab/smartseq2_multisample/pr_single_end/test_smartseq2_multisample_PR_SINGLE_END.wdl" message = "test_smartseq2_multisample_PR_SINGLE_END.wdl:48:21: error: type mismatch: expected type `Array[String]`, but found type `Array[String]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tests/skylab/smartseq2_multisample/pr_single_end/test_smartseq2_multisample_PR_SINGLE_END.wdl/#L48" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tests/skylab/smartseq2_multisample/pr_single_end/test_smartseq2_multisample_PR_SINGLE_END.wdl/#L48" [[diagnostics]] document = "broadinstitute/warp:/tests/skylab/smartseq2_multisample/pr_single_end/test_smartseq2_multisample_PR_SINGLE_END.wdl" message = "test_smartseq2_multisample_PR_SINGLE_END.wdl:58:46: warning[UnusedCall]: unused call `checker_workflow`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/tests/skylab/smartseq2_multisample/pr_single_end/test_smartseq2_multisample_PR_SINGLE_END.wdl/#L58" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/tests/skylab/smartseq2_multisample/pr_single_end/test_smartseq2_multisample_PR_SINGLE_END.wdl/#L58" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyArrays.wdl" message = "VerifyArrays.wdl:46:14: warning[UnusedInput]: unused input `done`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyArrays.wdl/#L46" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyArrays.wdl/#L46" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyArrays.wdl" message = "VerifyArrays.wdl:49:38: warning[UnusedCall]: unused call `VerifyIlluminaGenotypingArray`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyArrays.wdl/#L49" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyArrays.wdl/#L49" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyArrays.wdl" message = "VerifyArrays.wdl:66:40: warning[UnusedCall]: unused call `CompareParamsFiles`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyArrays.wdl/#L66" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyArrays.wdl/#L66" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyCheckFingerprint.wdl" message = "VerifyCheckFingerprint.wdl:31:14: warning[UnusedInput]: unused input `done`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyCheckFingerprint.wdl/#L31" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyCheckFingerprint.wdl/#L31" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyCheckFingerprint.wdl" message = "VerifyCheckFingerprint.wdl:42:55: warning[UnusedCall]: unused call `CompareOutputFingerprintVcfs`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyCheckFingerprint.wdl/#L42" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyCheckFingerprint.wdl/#L42" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyCramToUnmappedBamsUpdated.wdl" message = "VerifyCramToUnmappedBamsUpdated.wdl:9:14: warning[UnusedInput]: unused input `done`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyCramToUnmappedBamsUpdated.wdl/#L9" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyCramToUnmappedBamsUpdated.wdl/#L9" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyExomeReprocessing.wdl" message = "VerifyExomeReprocessing.wdl:24:14: warning[UnusedInput]: unused input `done`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyExomeReprocessing.wdl/#L24" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyExomeReprocessing.wdl/#L24" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyExomeReprocessing.wdl" message = "VerifyExomeReprocessing.wdl:37:35: warning[UnusedCall]: unused call `VerifyGermlineSingleSample`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyExomeReprocessing.wdl/#L37" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyExomeReprocessing.wdl/#L37" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyExternalReprocessing.wdl" message = "VerifyExternalReprocessing.wdl:10:10: warning[UnusedCall]: unused call `AssertTrue`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyExternalReprocessing.wdl/#L10" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyExternalReprocessing.wdl/#L10" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyGDCSomaticSingleSample.wdl" message = "VerifyGDCSomaticSingleSample.wdl:17:14: warning[UnusedInput]: unused input `done`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyGDCSomaticSingleSample.wdl/#L17" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyGDCSomaticSingleSample.wdl/#L17" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyGDCSomaticSingleSample.wdl" message = "VerifyGDCSomaticSingleSample.wdl:26:20: warning[UnusedCall]: unused call `CompareBams`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyGDCSomaticSingleSample.wdl/#L26" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyGDCSomaticSingleSample.wdl/#L26" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyGermlineSingleSample.wdl" message = "VerifyGermlineSingleSample.wdl:22:14: warning[UnusedInput]: unused input `done`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyGermlineSingleSample.wdl/#L22" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyGermlineSingleSample.wdl/#L22" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyGermlineSingleSample.wdl" message = "VerifyGermlineSingleSample.wdl:26:14: warning[UnusedCall]: unused call `CompareVCFsVerbosely`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyGermlineSingleSample.wdl/#L26" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyGermlineSingleSample.wdl/#L26" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyGermlineSingleSample.wdl" message = "VerifyGermlineSingleSample.wdl:40:8: warning[UnusedCall]: unused call `CompareGvcfs`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyGermlineSingleSample.wdl/#L40" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyGermlineSingleSample.wdl/#L40" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyGermlineSingleSample.wdl" message = "VerifyGermlineSingleSample.wdl:46:14: warning[UnusedCall]: unused call `CompareCrais`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyGermlineSingleSample.wdl/#L46" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyGermlineSingleSample.wdl/#L46" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyGermlineSingleSample.wdl" message = "VerifyGermlineSingleSample.wdl:52:14: warning[UnusedCall]: unused call `CompareCrams`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyGermlineSingleSample.wdl/#L52" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyGermlineSingleSample.wdl/#L52" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyGvcf.wdl" message = "VerifyGvcf.wdl:13:14: warning[UnusedInput]: unused input `done`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyGvcf.wdl/#L13" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyGvcf.wdl/#L13" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyGvcf.wdl" message = "VerifyGvcf.wdl:16:20: warning[UnusedCall]: unused call `CompareVCFsVerbosely`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyGvcf.wdl/#L16" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyGvcf.wdl/#L16" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyGvcf.wdl" message = "VerifyGvcf.wdl:24:20: warning[UnusedCall]: unused call `CompareVcfs`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyGvcf.wdl/#L24" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyGvcf.wdl/#L24" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyIlluminaGenotypingArray.wdl" message = "VerifyIlluminaGenotypingArray.wdl:102:24: warning[UnusedCall]: unused call `CompareGreenIdatMdf5Sum`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyIlluminaGenotypingArray.wdl/#L102" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyIlluminaGenotypingArray.wdl/#L102" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyIlluminaGenotypingArray.wdl" message = "VerifyIlluminaGenotypingArray.wdl:108:24: warning[UnusedCall]: unused call `CompareRedIdatMdf5Sum`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyIlluminaGenotypingArray.wdl/#L108" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyIlluminaGenotypingArray.wdl/#L108" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyIlluminaGenotypingArray.wdl" message = "VerifyIlluminaGenotypingArray.wdl:43:14: warning[UnusedInput]: unused input `done`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyIlluminaGenotypingArray.wdl/#L43" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyIlluminaGenotypingArray.wdl/#L43" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyIlluminaGenotypingArray.wdl" message = "VerifyIlluminaGenotypingArray.wdl:83:55: warning[UnusedCall]: unused call `CompareOutputVcfs`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyIlluminaGenotypingArray.wdl/#L83" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyIlluminaGenotypingArray.wdl/#L83" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyIlluminaGenotypingArray.wdl" message = "VerifyIlluminaGenotypingArray.wdl:89:55: warning[UnusedCall]: unused call `CompareOutputFingerprintVcfs`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyIlluminaGenotypingArray.wdl/#L89" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyIlluminaGenotypingArray.wdl/#L89" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyIlluminaGenotypingArray.wdl" message = "VerifyIlluminaGenotypingArray.wdl:95:14: warning[UnusedCall]: unused call `CompareGtcs`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyIlluminaGenotypingArray.wdl/#L95" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyIlluminaGenotypingArray.wdl/#L95" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyImputation.wdl" message = "VerifyImputation.wdl:43:14: warning[UnusedInput]: unused input `done`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyImputation.wdl/#L43" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyImputation.wdl/#L43" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyImputation.wdl" message = "VerifyImputation.wdl:56:55: warning[UnusedCall]: unused call `CompareOutputVcfs`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyImputation.wdl/#L56" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyImputation.wdl/#L56" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyImputation.wdl" message = "VerifyImputation.wdl:72:8: warning[UnusedCall]: unused call `CrosscheckFingerprints`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyImputation.wdl/#L72" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyImputation.wdl/#L72" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyJointGenotyping.wdl" message = "VerifyJointGenotyping.wdl:25:14: warning[UnusedInput]: unused input `done`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyJointGenotyping.wdl/#L25" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyJointGenotyping.wdl/#L25" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyJointGenotyping.wdl" message = "VerifyJointGenotyping.wdl:48:28: warning[UnusedCall]: unused call `VerifyMetrics`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyJointGenotyping.wdl/#L48" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyJointGenotyping.wdl/#L48" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyJointGenotyping.wdl" message = "VerifyJointGenotyping.wdl:54:40: warning[UnusedCall]: unused call `CompareIntervals`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyJointGenotyping.wdl/#L54" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyJointGenotyping.wdl/#L54" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyMetrics.wdl" message = "VerifyMetrics.wdl:73:11: warning[UnusedInput]: unused input `dependency_input`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyMetrics.wdl/#L73" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyMetrics.wdl/#L73" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyMetrics.wdl" message = "VerifyMetrics.wdl:87:117: error: cannot coerce type `Array[String]` to `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyMetrics.wdl/#L87" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyMetrics.wdl/#L87" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyMetrics.wdl" message = "VerifyMetrics.wdl:87:89: error: a placeholder cannot have more than one option" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyMetrics.wdl/#L87" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyMetrics.wdl/#L87" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyMultiSampleArrays.wdl" message = "VerifyMultiSampleArrays.wdl:25:14: warning[UnusedInput]: unused input `done`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyMultiSampleArrays.wdl/#L25" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyMultiSampleArrays.wdl/#L25" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyMultiSampleArrays.wdl" message = "VerifyMultiSampleArrays.wdl:28:14: warning[UnusedCall]: unused call `CompareVcfsAllowingQualityDifferences`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyMultiSampleArrays.wdl/#L28" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyMultiSampleArrays.wdl/#L28" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyMultiSampleSmartSeq2SingleNucleus.wdl" message = "VerifyMultiSampleSmartSeq2SingleNucleus.wdl:12:14: warning[UnusedInput]: unused input `done`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyMultiSampleSmartSeq2SingleNucleus.wdl/#L12" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyMultiSampleSmartSeq2SingleNucleus.wdl/#L12" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyMultiSampleSmartSeq2SingleNucleus.wdl" message = "VerifyMultiSampleSmartSeq2SingleNucleus.wdl:24:43: warning[UnusedCall]: unused call `CompareH5adFiles`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyMultiSampleSmartSeq2SingleNucleus.wdl/#L24" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyMultiSampleSmartSeq2SingleNucleus.wdl/#L24" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyMultiome.wdl" message = "VerifyMultiome.wdl:35:18: warning[UnusedInput]: unused input `done`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyMultiome.wdl/#L35" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyMultiome.wdl/#L35" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyMultiome.wdl" message = "VerifyMultiome.wdl:38:37: warning[UnusedCall]: unused call `CompareOptimusBams`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyMultiome.wdl/#L38" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyMultiome.wdl/#L38" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyMultiome.wdl" message = "VerifyMultiome.wdl:45:52: warning[UnusedCall]: unused call `CompareGeneMetrics`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyMultiome.wdl/#L45" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyMultiome.wdl/#L45" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyMultiome.wdl" message = "VerifyMultiome.wdl:51:52: warning[UnusedCall]: unused call `CompareCellMetrics`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyMultiome.wdl/#L51" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyMultiome.wdl/#L51" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyMultiome.wdl" message = "VerifyMultiome.wdl:57:37: warning[UnusedCall]: unused call `CompareAtacBams`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyMultiome.wdl/#L57" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyMultiome.wdl/#L57" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyMultiome.wdl" message = "VerifyMultiome.wdl:63:38: warning[UnusedCall]: unused call `CompareFragment`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyMultiome.wdl/#L63" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyMultiome.wdl/#L63" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyMultiome.wdl" message = "VerifyMultiome.wdl:68:46: warning[UnusedCall]: unused call `CompareH5adFilesATAC`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyMultiome.wdl/#L68" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyMultiome.wdl/#L68" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyMultiome.wdl" message = "VerifyMultiome.wdl:73:45: warning[UnusedCall]: unused call `CompareH5adFilesOptimus`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyMultiome.wdl/#L73" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyMultiome.wdl/#L73" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyMultiome.wdl" message = "VerifyMultiome.wdl:78:45: warning[UnusedCall]: unused call `CompareLibraryMetrics`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyMultiome.wdl/#L78" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyMultiome.wdl/#L78" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyMultiome.wdl" -message = "VerifyMultiome.wdl:83:42: warning[UnusedCall]: unused call `CompareAtacLibraryMetrics`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyMultiome.wdl/#L83" +message = "VerifyMultiome.wdl:83:51: warning[UnusedCall]: unused call `CompareAtacLibraryMetrics`" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyMultiome.wdl/#L83" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyMultiome.wdl" message = "VerifyMultiome.wdl:85:42: error: type mismatch: argument to function `select_all` expects type `Array[X]` where `X`: any optional type, but found type `Array[File]+`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyMultiome.wdl/#L85" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyMultiome.wdl/#L85" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyMultiome.wdl" message = "VerifyMultiome.wdl:86:43: error: type mismatch: argument to function `select_all` expects type `Array[X]` where `X`: any optional type, but found type `Array[File]+`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyMultiome.wdl/#L86" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyMultiome.wdl/#L86" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyNA12878.wdl" message = "VerifyNA12878.wdl:62:9: warning[UnusedDeclaration]: unused declaration `default_disk_space_gb`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyNA12878.wdl/#L62" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyNA12878.wdl/#L62" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyNA12878.wdl" message = "VerifyNA12878.wdl:65:47: error: type mismatch: multiplication operator is not supported for type `Int?` and type `Int`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyNA12878.wdl/#L65" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyNA12878.wdl/#L65" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyOptimus.wdl" message = "VerifyOptimus.wdl:23:14: warning[UnusedInput]: unused input `done`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyOptimus.wdl/#L23" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyOptimus.wdl/#L23" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyOptimus.wdl" message = "VerifyOptimus.wdl:26:35: warning[UnusedCall]: unused call `CompareBams`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyOptimus.wdl/#L26" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyOptimus.wdl/#L26" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyOptimus.wdl" message = "VerifyOptimus.wdl:33:50: warning[UnusedCall]: unused call `CompareGeneMetrics`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyOptimus.wdl/#L33" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyOptimus.wdl/#L33" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyOptimus.wdl" message = "VerifyOptimus.wdl:39:50: warning[UnusedCall]: unused call `CompareCellMetrics`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyOptimus.wdl/#L39" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyOptimus.wdl/#L39" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyOptimus.wdl" message = "VerifyOptimus.wdl:45:43: warning[UnusedCall]: unused call `CompareH5adFilesOptimus`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyOptimus.wdl/#L45" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyOptimus.wdl/#L45" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyOptimus.wdl" message = "VerifyOptimus.wdl:51:43: warning[UnusedCall]: unused call `CompareLibraryMetrics`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyOptimus.wdl/#L51" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyOptimus.wdl/#L51" + +[[diagnostics]] +document = "broadinstitute/warp:/verification/VerifyPairedTag.wdl" +message = "VerifyPairedTag.wdl:35:18: warning[UnusedInput]: unused input `done`" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyPairedTag.wdl/#L35" + +[[diagnostics]] +document = "broadinstitute/warp:/verification/VerifyPairedTag.wdl" +message = "VerifyPairedTag.wdl:38:37: warning[UnusedCall]: unused call `CompareOptimusBams`" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyPairedTag.wdl/#L38" + +[[diagnostics]] +document = "broadinstitute/warp:/verification/VerifyPairedTag.wdl" +message = "VerifyPairedTag.wdl:45:52: warning[UnusedCall]: unused call `CompareGeneMetrics`" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyPairedTag.wdl/#L45" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyPairedTag.wdl" -message = "VerifyPairedTag.wdl:32:18: warning[UnusedInput]: unused input `done`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyPairedTag.wdl/#L32" +message = "VerifyPairedTag.wdl:51:52: warning[UnusedCall]: unused call `CompareCellMetrics`" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyPairedTag.wdl/#L51" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyPairedTag.wdl" -message = "VerifyPairedTag.wdl:35:37: warning[UnusedCall]: unused call `CompareOptimusBams`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyPairedTag.wdl/#L35" +message = "VerifyPairedTag.wdl:57:37: warning[UnusedCall]: unused call `CompareAtacBams`" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyPairedTag.wdl/#L57" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyPairedTag.wdl" -message = "VerifyPairedTag.wdl:42:52: warning[UnusedCall]: unused call `CompareGeneMetrics`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyPairedTag.wdl/#L42" +message = "VerifyPairedTag.wdl:63:38: warning[UnusedCall]: unused call `CompareFragment`" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyPairedTag.wdl/#L63" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyPairedTag.wdl" -message = "VerifyPairedTag.wdl:48:52: warning[UnusedCall]: unused call `CompareCellMetrics`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyPairedTag.wdl/#L48" +message = "VerifyPairedTag.wdl:68:46: warning[UnusedCall]: unused call `CompareH5adFilesATAC`" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyPairedTag.wdl/#L68" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyPairedTag.wdl" -message = "VerifyPairedTag.wdl:54:37: warning[UnusedCall]: unused call `CompareAtacBams`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyPairedTag.wdl/#L54" +message = "VerifyPairedTag.wdl:73:45: warning[UnusedCall]: unused call `CompareH5adFilesOptimus`" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyPairedTag.wdl/#L73" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyPairedTag.wdl" -message = "VerifyPairedTag.wdl:60:38: warning[UnusedCall]: unused call `CompareFragment`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyPairedTag.wdl/#L60" +message = "VerifyPairedTag.wdl:78:45: warning[UnusedCall]: unused call `CompareLibraryMetrics`" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyPairedTag.wdl/#L78" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyPairedTag.wdl" -message = "VerifyPairedTag.wdl:65:46: warning[UnusedCall]: unused call `CompareH5adFilesATAC`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyPairedTag.wdl/#L65" +message = "VerifyPairedTag.wdl:84:51: warning[UnusedCall]: unused call `CompareAtacLibraryMetrics`" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyPairedTag.wdl/#L84" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyPairedTag.wdl" -message = "VerifyPairedTag.wdl:70:45: warning[UnusedCall]: unused call `CompareH5adFilesOptimus`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyPairedTag.wdl/#L70" +message = "VerifyPairedTag.wdl:86:38: error: type mismatch: argument to function `select_all` expects type `Array[X]` where `X`: any optional type, but found type `Array[File]+`" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyPairedTag.wdl/#L86" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyPairedTag.wdl" -message = "VerifyPairedTag.wdl:75:45: warning[UnusedCall]: unused call `CompareLibraryMetrics`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyPairedTag.wdl/#L75" +message = "VerifyPairedTag.wdl:87:39: error: type mismatch: argument to function `select_all` expects type `Array[X]` where `X`: any optional type, but found type `Array[File]+`" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyPairedTag.wdl/#L87" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyRNAWithUMIs.wdl" message = "VerifyRNAWithUMIs.wdl:103:50: warning[UnusedCall]: unused call `CompareGeneCounts`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyRNAWithUMIs.wdl/#L103" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyRNAWithUMIs.wdl/#L103" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyRNAWithUMIs.wdl" message = "VerifyRNAWithUMIs.wdl:109:50: warning[UnusedCall]: unused call `CompareExonCounts`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyRNAWithUMIs.wdl/#L109" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyRNAWithUMIs.wdl/#L109" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyRNAWithUMIs.wdl" message = "VerifyRNAWithUMIs.wdl:28:14: warning[UnusedInput]: unused input `done`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyRNAWithUMIs.wdl/#L28" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyRNAWithUMIs.wdl/#L28" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyRNAWithUMIs.wdl" message = "VerifyRNAWithUMIs.wdl:37:40: warning[UnusedCall]: unused call `CompareTextMetrics`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyRNAWithUMIs.wdl/#L37" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyRNAWithUMIs.wdl/#L37" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyRNAWithUMIs.wdl" message = "VerifyRNAWithUMIs.wdl:43:35: warning[UnusedCall]: unused call `CompareOutputBam`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyRNAWithUMIs.wdl/#L43" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyRNAWithUMIs.wdl/#L43" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyRNAWithUMIs.wdl" message = "VerifyRNAWithUMIs.wdl:97:50: warning[UnusedCall]: unused call `CompareGeneTpms`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyRNAWithUMIs.wdl/#L97" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyRNAWithUMIs.wdl/#L97" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyReprocessing.wdl" message = "VerifyReprocessing.wdl:33:35: warning[UnusedCall]: unused call `VerifyGermlineSingleSample`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyReprocessing.wdl/#L33" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyReprocessing.wdl/#L33" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifySlideSeq.wdl" message = "VerifySlideSeq.wdl:23:14: warning[UnusedInput]: unused input `done`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifySlideSeq.wdl/#L23" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifySlideSeq.wdl/#L23" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifySlideSeq.wdl" message = "VerifySlideSeq.wdl:26:35: warning[UnusedCall]: unused call `CompareBams`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifySlideSeq.wdl/#L26" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifySlideSeq.wdl/#L26" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifySlideSeq.wdl" message = "VerifySlideSeq.wdl:33:50: warning[UnusedCall]: unused call `CompareGeneMetrics`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifySlideSeq.wdl/#L33" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifySlideSeq.wdl/#L33" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifySlideSeq.wdl" message = "VerifySlideSeq.wdl:39:50: warning[UnusedCall]: unused call `CompareCellMetrics`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifySlideSeq.wdl/#L39" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifySlideSeq.wdl/#L39" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifySlideSeq.wdl" message = "VerifySlideSeq.wdl:45:50: warning[UnusedCall]: unused call `CompareUMIMetrics`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifySlideSeq.wdl/#L45" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifySlideSeq.wdl/#L45" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifySlideSeq.wdl" message = "VerifySlideSeq.wdl:51:43: warning[UnusedCall]: unused call `CompareH5adFilesOptimus`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifySlideSeq.wdl/#L51" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifySlideSeq.wdl/#L51" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifySomaticSingleSample.wdl" message = "VerifySomaticSingleSample.wdl:24:14: warning[UnusedCall]: unused call `CompareCrais`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifySomaticSingleSample.wdl/#L24" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifySomaticSingleSample.wdl/#L24" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifySomaticSingleSample.wdl" message = "VerifySomaticSingleSample.wdl:30:14: warning[UnusedCall]: unused call `CompareCrams`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifySomaticSingleSample.wdl/#L30" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifySomaticSingleSample.wdl/#L30" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyUltimaGenomicsJointGenotyping.wdl" message = "VerifyUltimaGenomicsJointGenotyping.wdl:25:14: warning[UnusedInput]: unused input `done`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyUltimaGenomicsJointGenotyping.wdl/#L25" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyUltimaGenomicsJointGenotyping.wdl/#L25" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyUltimaGenomicsJointGenotyping.wdl" message = "VerifyUltimaGenomicsJointGenotyping.wdl:47:28: warning[UnusedCall]: unused call `VerifyMetrics`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyUltimaGenomicsJointGenotyping.wdl/#L47" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyUltimaGenomicsJointGenotyping.wdl/#L47" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyUltimaGenomicsJointGenotyping.wdl" message = "VerifyUltimaGenomicsJointGenotyping.wdl:53:40: warning[UnusedCall]: unused call `CompareIntervals`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyUltimaGenomicsJointGenotyping.wdl/#L53" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyUltimaGenomicsJointGenotyping.wdl/#L53" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyUltimaGenomicsJointGenotyping.wdl" message = "VerifyUltimaGenomicsJointGenotyping.wdl:59:8: warning[UnusedCall]: unused call `CompareFingerprints`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyUltimaGenomicsJointGenotyping.wdl/#L59" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyUltimaGenomicsJointGenotyping.wdl/#L59" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyUltimaGenomicsWholeGenomeCramOnly.wdl" message = "VerifyUltimaGenomicsWholeGenomeCramOnly.wdl:102:115: error: cannot coerce type `Array[String]` to `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyUltimaGenomicsWholeGenomeCramOnly.wdl/#L102" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyUltimaGenomicsWholeGenomeCramOnly.wdl/#L102" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyUltimaGenomicsWholeGenomeCramOnly.wdl" message = "VerifyUltimaGenomicsWholeGenomeCramOnly.wdl:102:87: error: a placeholder cannot have more than one option" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyUltimaGenomicsWholeGenomeCramOnly.wdl/#L102" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyUltimaGenomicsWholeGenomeCramOnly.wdl/#L102" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyUltimaGenomicsWholeGenomeCramOnly.wdl" message = "VerifyUltimaGenomicsWholeGenomeCramOnly.wdl:17:14: warning[UnusedInput]: unused input `done`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyUltimaGenomicsWholeGenomeCramOnly.wdl/#L17" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyUltimaGenomicsWholeGenomeCramOnly.wdl/#L17" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyUltimaGenomicsWholeGenomeCramOnly.wdl" message = "VerifyUltimaGenomicsWholeGenomeCramOnly.wdl:64:14: warning[UnusedCall]: unused call `CompareCrams`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyUltimaGenomicsWholeGenomeCramOnly.wdl/#L64" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyUltimaGenomicsWholeGenomeCramOnly.wdl/#L64" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyUltimaGenomicsWholeGenomeCramOnly.wdl" message = "VerifyUltimaGenomicsWholeGenomeCramOnly.wdl:72:14: warning[UnusedCall]: unused call `CompareCrais`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyUltimaGenomicsWholeGenomeCramOnly.wdl/#L72" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyUltimaGenomicsWholeGenomeCramOnly.wdl/#L72" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyUltimaGenomicsWholeGenomeCramOnly.wdl" message = "VerifyUltimaGenomicsWholeGenomeCramOnly.wdl:89:11: warning[UnusedInput]: unused input `dependency_input`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyUltimaGenomicsWholeGenomeCramOnly.wdl/#L89" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyUltimaGenomicsWholeGenomeCramOnly.wdl/#L89" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl" message = "VerifyUltimaGenomicsWholeGenomeGermline.wdl:100:29: warning[UnusedCall]: unused call `CompareFilteredVcfs`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl/#L100" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl/#L100" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl" message = "VerifyUltimaGenomicsWholeGenomeGermline.wdl:107:29: warning[UnusedCall]: unused call `CompareGvcfs`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl/#L107" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl/#L107" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl" message = "VerifyUltimaGenomicsWholeGenomeGermline.wdl:114:38: warning[UnusedCall]: unused call `CompareGVcfsVerbosely`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl/#L114" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl/#L114" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl" message = "VerifyUltimaGenomicsWholeGenomeGermline.wdl:125:22: warning[UnusedCall]: unused call `VerifyNA12878`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl/#L125" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl/#L125" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl" message = "VerifyUltimaGenomicsWholeGenomeGermline.wdl:174:11: warning[UnusedInput]: unused input `dependency_input`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl/#L174" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl/#L174" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl" message = "VerifyUltimaGenomicsWholeGenomeGermline.wdl:187:115: error: cannot coerce type `Array[String]` to `String`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl/#L187" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl/#L187" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl" message = "VerifyUltimaGenomicsWholeGenomeGermline.wdl:187:87: error: a placeholder cannot have more than one option" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl/#L187" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl/#L187" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl" message = "VerifyUltimaGenomicsWholeGenomeGermline.wdl:32:14: warning[UnusedInput]: unused input `done`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl/#L32" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl/#L32" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl" message = "VerifyUltimaGenomicsWholeGenomeGermline.wdl:79:14: warning[UnusedCall]: unused call `CompareCrams`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl/#L79" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl/#L79" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl" message = "VerifyUltimaGenomicsWholeGenomeGermline.wdl:87:14: warning[UnusedCall]: unused call `CompareCrais`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl/#L87" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl/#L87" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl" message = "VerifyUltimaGenomicsWholeGenomeGermline.wdl:93:29: warning[UnusedCall]: unused call `CompareVcfs`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl/#L93" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyUltimaGenomicsWholeGenomeGermline.wdl/#L93" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyValidateChip.wdl" message = "VerifyValidateChip.wdl:40:14: warning[UnusedInput]: unused input `done`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyValidateChip.wdl/#L40" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyValidateChip.wdl/#L40" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyValidateChip.wdl" message = "VerifyValidateChip.wdl:43:14: warning[UnusedCall]: unused call `CompareGtcs`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyValidateChip.wdl/#L43" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyValidateChip.wdl/#L43" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyValidateChip.wdl" message = "VerifyValidateChip.wdl:50:55: warning[UnusedCall]: unused call `CompareOutputVcfs`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyValidateChip.wdl/#L50" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyValidateChip.wdl/#L50" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyValidateChip.wdl" message = "VerifyValidateChip.wdl:56:55: warning[UnusedCall]: unused call `CompareGenotypeConcordanceVcfs`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyValidateChip.wdl/#L56" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyValidateChip.wdl/#L56" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyValidateChip.wdl" message = "VerifyValidateChip.wdl:62:55: warning[UnusedCall]: unused call `CompareIndelGenotypeConcordanceVcfs`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyValidateChip.wdl/#L62" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyValidateChip.wdl/#L62" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyscATAC.wdl" message = "VerifyscATAC.wdl:12:14: warning[UnusedInput]: unused input `done`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyscATAC.wdl/#L12" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyscATAC.wdl/#L12" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyscATAC.wdl" message = "VerifyscATAC.wdl:15:35: warning[UnusedCall]: unused call `CompareBams`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyscATAC.wdl/#L15" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyscATAC.wdl/#L15" [[diagnostics]] document = "broadinstitute/warp:/verification/VerifyscATAC.wdl" message = "VerifyscATAC.wdl:22:43: warning[UnusedCall]: unused call `CompareSnapTextFiles`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/VerifyscATAC.wdl/#L22" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/VerifyscATAC.wdl/#L22" [[diagnostics]] document = "broadinstitute/warp:/verification/Verifysnm3C.wdl" message = "Verifysnm3C.wdl:23:18: warning[UnusedInput]: unused input `done`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/Verifysnm3C.wdl/#L23" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/Verifysnm3C.wdl/#L23" [[diagnostics]] document = "broadinstitute/warp:/verification/Verifysnm3C.wdl" message = "Verifysnm3C.wdl:26:52: warning[UnusedCall]: unused call `CompareMappingSummaryMetrics`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/Verifysnm3C.wdl/#L26" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/Verifysnm3C.wdl/#L26" [[diagnostics]] document = "broadinstitute/warp:/verification/Verifysnm3C.wdl" message = "Verifysnm3C.wdl:66:17: error: conflicting output name `done`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/Verifysnm3C.wdl/#L66" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/Verifysnm3C.wdl/#L66" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestBroadInternalRNAWithUMIs.wdl" message = "TestBroadInternalRNAWithUMIs.wdl:106:54: error: type mismatch: argument to function `select_all` expects type `Array[X]` where `X`: any optional type, but found type `Array[File]+`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestBroadInternalRNAWithUMIs.wdl/#L106" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestBroadInternalRNAWithUMIs.wdl/#L106" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestBroadInternalUltimaGenomics.wdl" message = "TestBroadInternalUltimaGenomics.wdl:57:27: error: type mismatch: expected type `Array[File]`, but found type `Array[File]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestBroadInternalUltimaGenomics.wdl/#L57" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestBroadInternalUltimaGenomics.wdl/#L57" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestBroadInternalUltimaGenomics.wdl" message = "TestBroadInternalUltimaGenomics.wdl:58:26: error: type mismatch: expected type `Array[File]`, but found type `Array[File]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestBroadInternalUltimaGenomics.wdl/#L58" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestBroadInternalUltimaGenomics.wdl/#L58" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestCheckFingerprint.wdl" message = "TestCheckFingerprint.wdl:33:15: warning[UnusedInput]: unused input `vault_token_path_arrays`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestCheckFingerprint.wdl/#L33" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestCheckFingerprint.wdl/#L33" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestExomeReprocessing.wdl" message = "TestExomeReprocessing.wdl:7:8: warning[UnusedImport]: unused import namespace `DNASeqStructs`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestExomeReprocessing.wdl/#L7" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestExomeReprocessing.wdl/#L7" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestExternalWholeGenomeReprocessing.wdl" message = "TestExternalWholeGenomeReprocessing.wdl:6:45: warning[UnusedImport]: unused import namespace `Utilities`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestExternalWholeGenomeReprocessing.wdl/#L6" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestExternalWholeGenomeReprocessing.wdl/#L6" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestGDCWholeGenomeSomaticSingleSample.wdl" message = "TestGDCWholeGenomeSomaticSingleSample.wdl:77:46: error: type mismatch: argument to function `select_all` expects type `Array[X]` where `X`: any optional type, but found type `Array[Array[File]]+`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestGDCWholeGenomeSomaticSingleSample.wdl/#L77" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestGDCWholeGenomeSomaticSingleSample.wdl/#L77" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestImputation.wdl" message = "TestImputation.wdl:141:20: error: type mismatch: argument to function `defined` expects type `X` where `X`: any optional type, but found type `Array[File]`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestImputation.wdl/#L141" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestImputation.wdl/#L141" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestImputation.wdl" message = "TestImputation.wdl:162:38: error: type mismatch: expected type `Array[File]`, but found type `Array[File]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestImputation.wdl/#L162" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestImputation.wdl/#L162" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestImputation.wdl" message = "TestImputation.wdl:163:46: error: type mismatch: expected type `Array[File]`, but found type `Array[File]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestImputation.wdl/#L163" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestImputation.wdl/#L163" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestImputation.wdl" message = "TestImputation.wdl:54:30: error: type mismatch: expected type `Array[File]`, but found type `Array[File]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestImputation.wdl/#L54" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestImputation.wdl/#L54" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestImputation.wdl" message = "TestImputation.wdl:55:37: error: type mismatch: expected type `Array[File]`, but found type `Array[File]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestImputation.wdl/#L55" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestImputation.wdl/#L55" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestImputation.wdl" message = "TestImputation.wdl:86:56: error: type mismatch: argument to function `select_all` expects type `Array[X]` where `X`: any optional type, but found type `Array[Array[File]]+`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestImputation.wdl/#L86" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestImputation.wdl/#L86" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestJointGenotyping.wdl" message = "TestJointGenotyping.wdl:110:20: error: type mismatch: expected type `Boolean`, but found type `Boolean?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestJointGenotyping.wdl/#L110" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestJointGenotyping.wdl/#L110" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestJointGenotyping.wdl" message = "TestJointGenotyping.wdl:85:44: error: type mismatch: expected type `Array[String]`, but found type `Array[String]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestJointGenotyping.wdl/#L85" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestJointGenotyping.wdl/#L85" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestJointGenotyping.wdl" message = "TestJointGenotyping.wdl:87:46: error: type mismatch: expected type `Array[String]`, but found type `Array[String]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestJointGenotyping.wdl/#L87" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestJointGenotyping.wdl/#L87" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestJointGenotyping.wdl" message = "TestJointGenotyping.wdl:88:49: error: type mismatch: expected type `Array[String]`, but found type `Array[String]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestJointGenotyping.wdl/#L88" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestJointGenotyping.wdl/#L88" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestMultiSampleSmartSeq2SingleNucleus.wdl" message = "TestMultiSampleSmartSeq2SingleNucleus.wdl:51:23: error: type mismatch: expected type `Array[String]`, but found type `Array[String]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestMultiSampleSmartSeq2SingleNucleus.wdl/#L51" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestMultiSampleSmartSeq2SingleNucleus.wdl/#L51" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestMultiSampleSmartSeq2SingleNucleus.wdl" message = "TestMultiSampleSmartSeq2SingleNucleus.wdl:56:22: error: type mismatch: expected type `Array[String]`, but found type `Array[String]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestMultiSampleSmartSeq2SingleNucleus.wdl/#L56" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestMultiSampleSmartSeq2SingleNucleus.wdl/#L56" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestMultiSampleSmartSeq2SingleNucleus.wdl" message = "TestMultiSampleSmartSeq2SingleNucleus.wdl:57:24: error: type mismatch: expected type `Array[String]`, but found type `Array[String]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestMultiSampleSmartSeq2SingleNucleus.wdl/#L57" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestMultiSampleSmartSeq2SingleNucleus.wdl/#L57" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestMultiSampleSmartSeq2SingleNucleus.wdl" message = "TestMultiSampleSmartSeq2SingleNucleus.wdl:58:19: error: type mismatch: expected type `Array[String]`, but found type `Array[String]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestMultiSampleSmartSeq2SingleNucleus.wdl/#L58" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestMultiSampleSmartSeq2SingleNucleus.wdl/#L58" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestMultiSampleSmartSeq2SingleNucleus.wdl" message = "TestMultiSampleSmartSeq2SingleNucleus.wdl:59:19: error: type mismatch: expected type `Array[String]`, but found type `Array[String]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestMultiSampleSmartSeq2SingleNucleus.wdl/#L59" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestMultiSampleSmartSeq2SingleNucleus.wdl/#L59" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestMultiSampleSmartSeq2SingleNucleus.wdl" message = "TestMultiSampleSmartSeq2SingleNucleus.wdl:60:17: error: type mismatch: expected type `Array[String]`, but found type `Array[String]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestMultiSampleSmartSeq2SingleNucleus.wdl/#L60" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestMultiSampleSmartSeq2SingleNucleus.wdl/#L60" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestMultiome.wdl" message = "TestMultiome.wdl:67:24: error: type mismatch: expected type `Array[File]`, but found type `Array[File]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestMultiome.wdl/#L67" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestMultiome.wdl/#L67" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestOptimus.wdl" message = "TestOptimus.wdl:118:42: error: type mismatch: argument to function `select_all` expects type `Array[X]` where `X`: any optional type, but found type `Array[File]+`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestOptimus.wdl/#L118" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestOptimus.wdl/#L118" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestOptimus.wdl" message = "TestOptimus.wdl:172:14: error: type mismatch: argument to function `defined` expects type `X` where `X`: any optional type, but found type `File`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestOptimus.wdl/#L172" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestOptimus.wdl/#L172" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestOptimus.wdl" message = "TestOptimus.wdl:28:11: warning[UnusedInput]: unused input `mt_genes`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestOptimus.wdl/#L28" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestOptimus.wdl/#L28" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestOptimus.wdl" message = "TestOptimus.wdl:76:36: error: type mismatch: expected type `Array[File]`, but found type `Array[File]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestOptimus.wdl/#L76" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestOptimus.wdl/#L76" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestPairedTag.wdl" message = "TestPairedTag.wdl:57:15: warning[UnusedInput]: unused input `run_cellbender`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestPairedTag.wdl/#L57" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestPairedTag.wdl/#L57" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestPairedTag.wdl" message = "TestPairedTag.wdl:71:24: error: type mismatch: expected type `Array[File]`, but found type `Array[File]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestPairedTag.wdl/#L71" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestPairedTag.wdl/#L71" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestRNAWithUMIsPipeline.wdl" message = "TestRNAWithUMIsPipeline.wdl:100:47: error: type mismatch: argument to function `select_all` expects type `Array[X]` where `X`: any optional type, but found type `Array[File]+`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestRNAWithUMIsPipeline.wdl/#L100" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestRNAWithUMIsPipeline.wdl/#L100" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestRNAWithUMIsPipeline.wdl" message = "TestRNAWithUMIsPipeline.wdl:110:52: error: type mismatch: argument to function `select_all` expects type `Array[X]` where `X`: any optional type, but found type `Array[File]+`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestRNAWithUMIsPipeline.wdl/#L110" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestRNAWithUMIsPipeline.wdl/#L110" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestRNAWithUMIsPipeline.wdl" message = "TestRNAWithUMIsPipeline.wdl:84:47: error: type mismatch: argument to function `select_all` expects type `Array[X]` where `X`: any optional type, but found type `Array[File]+`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestRNAWithUMIsPipeline.wdl/#L84" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestRNAWithUMIsPipeline.wdl/#L84" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestReblockGVCF.wdl" message = "TestReblockGVCF.wdl:49:31: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestReblockGVCF.wdl/#L49" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestReblockGVCF.wdl/#L49" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestSlideSeq.wdl" message = "TestSlideSeq.wdl:40:20: error: type mismatch: expected type `Array[File]`, but found type `Array[File]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestSlideSeq.wdl/#L40" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestSlideSeq.wdl/#L40" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestUltimaGenomicsWholeGenomeCramOnly.wdl" message = "TestUltimaGenomicsWholeGenomeCramOnly.wdl:39:27: error: type mismatch: expected type `Array[File]`, but found type `Array[File]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestUltimaGenomicsWholeGenomeCramOnly.wdl/#L39" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestUltimaGenomicsWholeGenomeCramOnly.wdl/#L39" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestUltimaGenomicsWholeGenomeCramOnly.wdl" message = "TestUltimaGenomicsWholeGenomeCramOnly.wdl:40:26: error: type mismatch: expected type `Array[File]`, but found type `Array[File]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestUltimaGenomicsWholeGenomeCramOnly.wdl/#L40" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestUltimaGenomicsWholeGenomeCramOnly.wdl/#L40" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestUltimaGenomicsWholeGenomeGermline.wdl" message = "TestUltimaGenomicsWholeGenomeGermline.wdl:43:27: error: type mismatch: expected type `Array[File]`, but found type `Array[File]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestUltimaGenomicsWholeGenomeGermline.wdl/#L43" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestUltimaGenomicsWholeGenomeGermline.wdl/#L43" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestUltimaGenomicsWholeGenomeGermline.wdl" message = "TestUltimaGenomicsWholeGenomeGermline.wdl:44:26: error: type mismatch: expected type `Array[File]`, but found type `Array[File]?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestUltimaGenomicsWholeGenomeGermline.wdl/#L44" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestUltimaGenomicsWholeGenomeGermline.wdl/#L44" [[diagnostics]] document = "broadinstitute/warp:/verification/test-wdls/TestWholeGenomeGermlineSingleSample.wdl" message = "TestWholeGenomeGermlineSingleSample.wdl:54:45: error: type mismatch: expected type `DragmapReference`, but found type `DragmapReference?`" -permalink = "https://github.com/broadinstitute/warp/blob/6fda53e5a80d0ce7923785f95a0acb157558dadd/verification/test-wdls/TestWholeGenomeGermlineSingleSample.wdl/#L54" +permalink = "https://github.com/broadinstitute/warp/blob/158772d35e6e83ecbdd43450e6cd2d7f3519bfc7/verification/test-wdls/TestWholeGenomeGermlineSingleSample.wdl/#L54" [[diagnostics]] document = "chanzuckerberg/czid-workflows:/workflows/amr/run.wdl" @@ -4454,1734 +4474,1734 @@ permalink = "https://github.com/stjudecloud/workflows/blob/d6b826dd4deafaf7e9425 [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/assembly/task_ivar_consensus.wdl" message = "task_ivar_consensus.wdl:11:18: error: type mismatch: expected type `Int`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/assembly/task_ivar_consensus.wdl/#L11" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/assembly/task_ivar_consensus.wdl/#L11" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/assembly/task_ivar_consensus.wdl" message = "task_ivar_consensus.wdl:12:20: error: type mismatch: expected type `Int`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/assembly/task_ivar_consensus.wdl/#L12" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/assembly/task_ivar_consensus.wdl/#L12" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/assembly/task_ivar_consensus.wdl" message = "task_ivar_consensus.wdl:9:21: error: type mismatch: expected type `Int`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/assembly/task_ivar_consensus.wdl/#L9" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/assembly/task_ivar_consensus.wdl/#L9" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/assembly/task_metaspades.wdl" message = "task_metaspades.wdl:39:10: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/assembly/task_metaspades.wdl/#L39" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/assembly/task_metaspades.wdl/#L39" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/assembly/task_shovill.wdl" message = "task_shovill.wdl:77:10: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/assembly/task_shovill.wdl/#L77" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/assembly/task_shovill.wdl/#L77" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/gene_typing/variant_detection/task_ivar_variant_call.wdl" message = "task_ivar_variant_call.wdl:10:21: error: type mismatch: expected type `Int`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/gene_typing/variant_detection/task_ivar_variant_call.wdl/#L10" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/gene_typing/variant_detection/task_ivar_variant_call.wdl/#L10" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/gene_typing/variant_detection/task_ivar_variant_call.wdl" message = "task_ivar_variant_call.wdl:12:18: error: type mismatch: expected type `Int`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/gene_typing/variant_detection/task_ivar_variant_call.wdl/#L12" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/gene_typing/variant_detection/task_ivar_variant_call.wdl/#L12" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/gene_typing/variant_detection/task_ivar_variant_call.wdl" message = "task_ivar_variant_call.wdl:13:20: error: type mismatch: expected type `Int`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/gene_typing/variant_detection/task_ivar_variant_call.wdl/#L13" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/gene_typing/variant_detection/task_ivar_variant_call.wdl/#L13" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/gene_typing/variant_detection/task_ivar_variant_call.wdl" message = "task_ivar_variant_call.wdl:95:23: error: type mismatch: expected type `Int`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/gene_typing/variant_detection/task_ivar_variant_call.wdl/#L95" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/gene_typing/variant_detection/task_ivar_variant_call.wdl/#L95" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/gene_typing/variant_detection/task_snippy_gene_query.wdl" message = "task_snippy_gene_query.wdl:69:10: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/gene_typing/variant_detection/task_snippy_gene_query.wdl/#L69" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/gene_typing/variant_detection/task_snippy_gene_query.wdl/#L69" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/gene_typing/variant_detection/task_snippy_variants.wdl" message = "task_snippy_variants.wdl:162:12: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/gene_typing/variant_detection/task_snippy_variants.wdl/#L162" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/gene_typing/variant_detection/task_snippy_variants.wdl/#L162" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/quality_control/advanced_metrics/task_gambittools.wdl" message = "task_gambittools.wdl:67:12: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/quality_control/advanced_metrics/task_gambittools.wdl/#L67" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/quality_control/advanced_metrics/task_gambittools.wdl/#L67" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/quality_control/basic_statistics/task_assembly_metrics.wdl" message = "task_assembly_metrics.wdl:72:22: error: type mismatch: expected type `Float`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/quality_control/basic_statistics/task_assembly_metrics.wdl/#L72" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/quality_control/basic_statistics/task_assembly_metrics.wdl/#L72" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/quality_control/basic_statistics/task_assembly_metrics.wdl" message = "task_assembly_metrics.wdl:73:19: error: type mismatch: expected type `Float`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/quality_control/basic_statistics/task_assembly_metrics.wdl/#L73" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/quality_control/basic_statistics/task_assembly_metrics.wdl/#L73" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/quality_control/basic_statistics/task_assembly_metrics.wdl" message = "task_assembly_metrics.wdl:74:23: error: type mismatch: expected type `Float`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/quality_control/basic_statistics/task_assembly_metrics.wdl/#L74" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/quality_control/basic_statistics/task_assembly_metrics.wdl/#L74" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/quality_control/basic_statistics/task_assembly_metrics.wdl" message = "task_assembly_metrics.wdl:75:22: error: type mismatch: expected type `Float`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/quality_control/basic_statistics/task_assembly_metrics.wdl/#L75" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/quality_control/basic_statistics/task_assembly_metrics.wdl/#L75" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/quality_control/basic_statistics/task_assembly_metrics.wdl" message = "task_assembly_metrics.wdl:76:37: error: type mismatch: expected type `Float`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/quality_control/basic_statistics/task_assembly_metrics.wdl/#L76" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/quality_control/basic_statistics/task_assembly_metrics.wdl/#L76" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/quality_control/basic_statistics/task_cg_pipeline.wdl" message = "task_cg_pipeline.wdl:102:10: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/quality_control/basic_statistics/task_cg_pipeline.wdl/#L102" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/quality_control/basic_statistics/task_cg_pipeline.wdl/#L102" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/quality_control/basic_statistics/task_consensus_qc.wdl" message = "task_consensus_qc.wdl:46:20: error: type mismatch: expected type `Int`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/quality_control/basic_statistics/task_consensus_qc.wdl/#L46" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/quality_control/basic_statistics/task_consensus_qc.wdl/#L46" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/quality_control/basic_statistics/task_consensus_qc.wdl" message = "task_consensus_qc.wdl:47:23: error: type mismatch: expected type `Int`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/quality_control/basic_statistics/task_consensus_qc.wdl/#L47" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/quality_control/basic_statistics/task_consensus_qc.wdl/#L47" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/quality_control/basic_statistics/task_consensus_qc.wdl" message = "task_consensus_qc.wdl:48:29: error: type mismatch: expected type `Int`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/quality_control/basic_statistics/task_consensus_qc.wdl/#L48" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/quality_control/basic_statistics/task_consensus_qc.wdl/#L48" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/quality_control/basic_statistics/task_consensus_qc.wdl" message = "task_consensus_qc.wdl:49:24: error: type mismatch: expected type `Int`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/quality_control/basic_statistics/task_consensus_qc.wdl/#L49" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/quality_control/basic_statistics/task_consensus_qc.wdl/#L49" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/quality_control/basic_statistics/task_consensus_qc.wdl" message = "task_consensus_qc.wdl:50:40: error: type mismatch: expected type `Float`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/quality_control/basic_statistics/task_consensus_qc.wdl/#L50" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/quality_control/basic_statistics/task_consensus_qc.wdl/#L50" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/quality_control/basic_statistics/task_quast.wdl" message = "task_quast.wdl:64:12: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/quality_control/basic_statistics/task_quast.wdl/#L64" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/quality_control/basic_statistics/task_quast.wdl/#L64" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/quality_control/basic_statistics/task_readlength.wdl" message = "task_readlength.wdl:26:33: error: type mismatch: expected type `Float`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/quality_control/basic_statistics/task_readlength.wdl/#L26" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/quality_control/basic_statistics/task_readlength.wdl/#L26" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/quality_control/comparisons/task_screen.wdl" message = "task_screen.wdl:15:13: warning[UnusedInput]: unused input `organism`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/quality_control/comparisons/task_screen.wdl/#L15" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/quality_control/comparisons/task_screen.wdl/#L15" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/quality_control/comparisons/task_screen.wdl" message = "task_screen.wdl:187:13: warning[UnusedInput]: unused input `organism`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/quality_control/comparisons/task_screen.wdl/#L187" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/quality_control/comparisons/task_screen.wdl/#L187" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/species_typing/salmonella/task_genotyphi.wdl" message = "task_genotyphi.wdl:61:50: error: type mismatch: expected type `Float`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/species_typing/salmonella/task_genotyphi.wdl/#L61" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/species_typing/salmonella/task_genotyphi.wdl/#L61" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/taxon_id/contamination/task_midas.wdl" message = "task_midas.wdl:76:45: error: type mismatch: expected type `Float`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/taxon_id/contamination/task_midas.wdl/#L76" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/taxon_id/contamination/task_midas.wdl/#L76" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/taxon_id/contamination/task_midas.wdl" message = "task_midas.wdl:77:44: error: type mismatch: expected type `Float`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/taxon_id/contamination/task_midas.wdl/#L77" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/taxon_id/contamination/task_midas.wdl/#L77" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/taxon_id/task_gambit.wdl" message = "task_gambit.wdl:164:10: error: type mismatch: expected type `Int` or type `Float`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/taxon_id/task_gambit.wdl/#L164" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/taxon_id/task_gambit.wdl/#L164" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/utilities/data_handling/task_parse_mapping.wdl" message = "task_parse_mapping.wdl:133:20: error: type mismatch: expected type `Int`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/utilities/data_handling/task_parse_mapping.wdl/#L133" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/utilities/data_handling/task_parse_mapping.wdl/#L133" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/tasks/utilities/submission/task_broad_ncbi_tools.wdl" message = "task_broad_ncbi_tools.wdl:11:12: warning[UnusedInput]: unused input `docker`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/tasks/utilities/submission/task_broad_ncbi_tools.wdl/#L11" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/tasks/utilities/submission/task_broad_ncbi_tools.wdl/#L11" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/freyja/wf_freyja_fastq.wdl" message = "wf_freyja_fastq.wdl:116:120: error: type mismatch: a type common to both type `Int?` and type `String` does not exist" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/freyja/wf_freyja_fastq.wdl/#L116" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/freyja/wf_freyja_fastq.wdl/#L116" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/freyja/wf_freyja_fastq.wdl" message = "wf_freyja_fastq.wdl:116:40: error: type mismatch: expected type `String`, but found type `Int`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/freyja/wf_freyja_fastq.wdl/#L116" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/freyja/wf_freyja_fastq.wdl/#L116" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/freyja/wf_freyja_fastq.wdl" message = "wf_freyja_fastq.wdl:122:126: error: type mismatch: a type common to both type `Int?` and type `String` does not exist" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/freyja/wf_freyja_fastq.wdl/#L122" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/freyja/wf_freyja_fastq.wdl/#L122" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/freyja/wf_freyja_fastq.wdl" message = "wf_freyja_fastq.wdl:122:42: error: type mismatch: expected type `String`, but found type `Int`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/freyja/wf_freyja_fastq.wdl/#L122" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/freyja/wf_freyja_fastq.wdl/#L122" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/freyja/wf_freyja_fastq.wdl" message = "wf_freyja_fastq.wdl:128:108: error: type mismatch: a type common to both type `Int?` and type `String` does not exist" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/freyja/wf_freyja_fastq.wdl/#L128" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/freyja/wf_freyja_fastq.wdl/#L128" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/freyja/wf_freyja_fastq.wdl" message = "wf_freyja_fastq.wdl:128:36: error: type mismatch: expected type `String`, but found type `Int`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/freyja/wf_freyja_fastq.wdl/#L128" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/freyja/wf_freyja_fastq.wdl/#L128" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/freyja/wf_freyja_fastq.wdl" message = "wf_freyja_fastq.wdl:135:114: error: type mismatch: a type common to both type `Int?` and type `String` does not exist" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/freyja/wf_freyja_fastq.wdl/#L135" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/freyja/wf_freyja_fastq.wdl/#L135" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/freyja/wf_freyja_fastq.wdl" message = "wf_freyja_fastq.wdl:135:38: error: type mismatch: expected type `String`, but found type `Int`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/freyja/wf_freyja_fastq.wdl/#L135" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/freyja/wf_freyja_fastq.wdl/#L135" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/freyja/wf_freyja_plot.wdl" message = "wf_freyja_plot.wdl:18:25: error: type mismatch: expected type `Array[String]`, but found type `Array[String]?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/freyja/wf_freyja_plot.wdl/#L18" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/freyja/wf_freyja_plot.wdl/#L18" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/freyja/wf_freyja_update.wdl" message = "wf_freyja_update.wdl:13:17: warning[UnusedCall]: unused call `transfer_files`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/freyja/wf_freyja_update.wdl/#L13" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/freyja/wf_freyja_update.wdl/#L13" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_augur.wdl" message = "wf_augur.wdl:153:80: error: type mismatch: argument to function `defined` expects type `X` where `X`: any optional type, but found type `File`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_augur.wdl/#L153" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_augur.wdl/#L153" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_augur.wdl" message = "wf_augur.wdl:62:21: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_augur.wdl/#L62" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_augur.wdl/#L62" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_core_gene_snp.wdl" message = "wf_core_gene_snp.wdl:84:24: error: type mismatch: expected type `Array[String]`, but found type `Array[String]?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_core_gene_snp.wdl/#L84" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_core_gene_snp.wdl/#L84" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_mashtree_fasta.wdl" message = "wf_mashtree_fasta.wdl:37:24: error: type mismatch: expected type `Array[String]`, but found type `Array[String]?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_mashtree_fasta.wdl/#L37" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_mashtree_fasta.wdl/#L37" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_nextclade_addToRefTree.wdl" message = "wf_nextclade_addToRefTree.wdl:33:58: error: type mismatch: argument to function `select_first` expects type `Array[X]` where `X`: any optional type, but found type `Array[String]+`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_nextclade_addToRefTree.wdl/#L33" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_nextclade_addToRefTree.wdl/#L33" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_nextclade_addToRefTree.wdl" message = "wf_nextclade_addToRefTree.wdl:34:53: error: type mismatch: argument to function `select_first` expects type `Array[X]` where `X`: any optional type, but found type `Array[File]+`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_nextclade_addToRefTree.wdl/#L34" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_nextclade_addToRefTree.wdl/#L34" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_nextclade_addToRefTree.wdl" message = "wf_nextclade_addToRefTree.wdl:35:51: error: type mismatch: argument to function `select_first` expects type `Array[X]` where `X`: any optional type, but found type `Array[File]+`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_nextclade_addToRefTree.wdl/#L35" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_nextclade_addToRefTree.wdl/#L35" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_nextclade_addToRefTree.wdl" message = "wf_nextclade_addToRefTree.wdl:36:52: error: type mismatch: argument to function `select_first` expects type `Array[X]` where `X`: any optional type, but found type `Array[File]+`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_nextclade_addToRefTree.wdl/#L36" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_nextclade_addToRefTree.wdl/#L36" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_nextclade_addToRefTree.wdl" message = "wf_nextclade_addToRefTree.wdl:37:57: error: type mismatch: argument to function `select_first` expects type `Array[X]` where `X`: any optional type, but found type `Array[String]+`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_nextclade_addToRefTree.wdl/#L37" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_nextclade_addToRefTree.wdl/#L37" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_snippy_tree.wdl" message = "wf_snippy_tree.wdl:102:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_snippy_tree.wdl/#L102" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_snippy_tree.wdl/#L102" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_snippy_tree.wdl" message = "wf_snippy_tree.wdl:107:15: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_snippy_tree.wdl/#L107" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_snippy_tree.wdl/#L107" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_snippy_tree.wdl" message = "wf_snippy_tree.wdl:108:18: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_snippy_tree.wdl/#L108" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_snippy_tree.wdl/#L108" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_snippy_tree.wdl" message = "wf_snippy_tree.wdl:109:21: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_snippy_tree.wdl/#L109" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_snippy_tree.wdl/#L109" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_snippy_tree.wdl" message = "wf_snippy_tree.wdl:120:28: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_snippy_tree.wdl/#L120" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_snippy_tree.wdl/#L120" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_snippy_tree.wdl" message = "wf_snippy_tree.wdl:121:16: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_snippy_tree.wdl/#L121" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_snippy_tree.wdl/#L121" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_snippy_tree.wdl" message = "wf_snippy_tree.wdl:122:13: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_snippy_tree.wdl/#L122" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_snippy_tree.wdl/#L122" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_snippy_tree.wdl" message = "wf_snippy_tree.wdl:123:16: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_snippy_tree.wdl/#L123" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_snippy_tree.wdl/#L123" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_snippy_tree.wdl" message = "wf_snippy_tree.wdl:124:19: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_snippy_tree.wdl/#L124" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_snippy_tree.wdl/#L124" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_snippy_tree.wdl" message = "wf_snippy_tree.wdl:133:16: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_snippy_tree.wdl/#L133" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_snippy_tree.wdl/#L133" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_snippy_tree.wdl" message = "wf_snippy_tree.wdl:151:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_snippy_tree.wdl/#L151" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_snippy_tree.wdl/#L151" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_snippy_tree.wdl" message = "wf_snippy_tree.wdl:72:16: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_snippy_tree.wdl/#L72" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_snippy_tree.wdl/#L72" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_snippy_tree.wdl" message = "wf_snippy_tree.wdl:73:13: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_snippy_tree.wdl/#L73" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_snippy_tree.wdl/#L73" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_snippy_tree.wdl" message = "wf_snippy_tree.wdl:74:19: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_snippy_tree.wdl/#L74" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_snippy_tree.wdl/#L74" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_snippy_tree.wdl" message = "wf_snippy_tree.wdl:75:16: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_snippy_tree.wdl/#L75" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_snippy_tree.wdl/#L75" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_snippy_tree.wdl" message = "wf_snippy_tree.wdl:85:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_snippy_tree.wdl/#L85" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_snippy_tree.wdl/#L85" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_snippy_tree.wdl" message = "wf_snippy_tree.wdl:86:21: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_snippy_tree.wdl/#L86" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_snippy_tree.wdl/#L86" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_snippy_tree.wdl" message = "wf_snippy_tree.wdl:87:18: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_snippy_tree.wdl/#L87" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_snippy_tree.wdl/#L87" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/phylogenetics/wf_snippy_tree.wdl" message = "wf_snippy_tree.wdl:88:15: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/phylogenetics/wf_snippy_tree.wdl/#L88" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/phylogenetics/wf_snippy_tree.wdl/#L88" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/standalone_modules/wf_nullarbor.wdl" message = "wf_nullarbor.wdl:27:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/standalone_modules/wf_nullarbor.wdl/#L27" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/standalone_modules/wf_nullarbor.wdl/#L27" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/standalone_modules/wf_nullarbor.wdl" message = "wf_nullarbor.wdl:32:22: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/standalone_modules/wf_nullarbor.wdl/#L32" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/standalone_modules/wf_nullarbor.wdl/#L32" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/standalone_modules/wf_nullarbor.wdl" message = "wf_nullarbor.wdl:33:19: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/standalone_modules/wf_nullarbor.wdl/#L33" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/standalone_modules/wf_nullarbor.wdl/#L33" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/standalone_modules/wf_nullarbor.wdl" message = "wf_nullarbor.wdl:34:17: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/standalone_modules/wf_nullarbor.wdl/#L34" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/standalone_modules/wf_nullarbor.wdl/#L34" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/standalone_modules/wf_nullarbor.wdl" message = "wf_nullarbor.wdl:35:16: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/standalone_modules/wf_nullarbor.wdl/#L35" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/standalone_modules/wf_nullarbor.wdl/#L35" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/standalone_modules/wf_nullarbor.wdl" message = "wf_nullarbor.wdl:36:16: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/standalone_modules/wf_nullarbor.wdl/#L36" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/standalone_modules/wf_nullarbor.wdl/#L36" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/standalone_modules/wf_nullarbor.wdl" message = "wf_nullarbor.wdl:37:13: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/standalone_modules/wf_nullarbor.wdl/#L37" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/standalone_modules/wf_nullarbor.wdl/#L37" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/standalone_modules/wf_nullarbor.wdl" message = "wf_nullarbor.wdl:38:20: error: type mismatch: expected type `File`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/standalone_modules/wf_nullarbor.wdl/#L38" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/standalone_modules/wf_nullarbor.wdl/#L38" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/standalone_modules/wf_nullarbor.wdl" message = "wf_nullarbor.wdl:39:20: error: type mismatch: expected type `File`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/standalone_modules/wf_nullarbor.wdl/#L39" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/standalone_modules/wf_nullarbor.wdl/#L39" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/standalone_modules/wf_nullarbor.wdl" message = "wf_nullarbor.wdl:40:23: error: type mismatch: expected type `File`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/standalone_modules/wf_nullarbor.wdl/#L40" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/standalone_modules/wf_nullarbor.wdl/#L40" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/standalone_modules/wf_snippy_variants.wdl" message = "wf_snippy_variants.wdl:37:16: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/standalone_modules/wf_snippy_variants.wdl/#L37" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/standalone_modules/wf_snippy_variants.wdl/#L37" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/standalone_modules/wf_snippy_variants.wdl" message = "wf_snippy_variants.wdl:38:13: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/standalone_modules/wf_snippy_variants.wdl/#L38" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/standalone_modules/wf_snippy_variants.wdl/#L38" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/standalone_modules/wf_snippy_variants.wdl" message = "wf_snippy_variants.wdl:39:16: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/standalone_modules/wf_snippy_variants.wdl/#L39" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/standalone_modules/wf_snippy_variants.wdl/#L39" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/standalone_modules/wf_snippy_variants.wdl" message = "wf_snippy_variants.wdl:42:22: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/standalone_modules/wf_snippy_variants.wdl/#L42" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/standalone_modules/wf_snippy_variants.wdl/#L42" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/standalone_modules/wf_snippy_variants.wdl" message = "wf_snippy_variants.wdl:69:45: error: type mismatch: expected type `Int`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/standalone_modules/wf_snippy_variants.wdl/#L69" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/standalone_modules/wf_snippy_variants.wdl/#L69" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/standalone_modules/wf_snippy_variants.wdl" message = "wf_snippy_variants.wdl:71:40: error: type mismatch: expected type `Int`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/standalone_modules/wf_snippy_variants.wdl/#L71" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/standalone_modules/wf_snippy_variants.wdl/#L71" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/standalone_modules/wf_snippy_variants.wdl" message = "wf_snippy_variants.wdl:72:50: error: type mismatch: expected type `Float`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/standalone_modules/wf_snippy_variants.wdl/#L72" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/standalone_modules/wf_snippy_variants.wdl/#L72" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/standalone_modules/wf_snippy_variants.wdl" message = "wf_snippy_variants.wdl:74:52: error: type mismatch: expected type `Float`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/standalone_modules/wf_snippy_variants.wdl/#L74" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/standalone_modules/wf_snippy_variants.wdl/#L74" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/theiacov/wf_theiacov_clearlabs.wdl" message = "wf_theiacov_clearlabs.wdl:148:26: error: type mismatch: expected type `String?`, but found type `Float`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/theiacov/wf_theiacov_clearlabs.wdl/#L148" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/theiacov/wf_theiacov_clearlabs.wdl/#L148" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/theiacov/wf_theiacov_illumina_pe.wdl" message = "wf_theiacov_illumina_pe.wdl:233:38: error: type mismatch: expected type `Float?`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/theiacov/wf_theiacov_illumina_pe.wdl/#L233" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/theiacov/wf_theiacov_illumina_pe.wdl/#L233" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/theiacov/wf_theiacov_illumina_pe.wdl" message = "wf_theiacov_illumina_pe.wdl:4:84: warning[UnusedImport]: unused import namespace `assembly_metrics`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/theiacov/wf_theiacov_illumina_pe.wdl/#L4" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/theiacov/wf_theiacov_illumina_pe.wdl/#L4" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/theiacov/wf_theiacov_illumina_se.wdl" message = "wf_theiacov_illumina_se.wdl:192:38: error: type mismatch: expected type `Float?`, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/theiacov/wf_theiacov_illumina_se.wdl/#L192" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/theiacov/wf_theiacov_illumina_se.wdl/#L192" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/theiacov/wf_theiacov_illumina_se.wdl" message = "wf_theiacov_illumina_se.wdl:275:29: error: type mismatch: expected type `Float?`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/theiacov/wf_theiacov_illumina_se.wdl/#L275" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/theiacov/wf_theiacov_illumina_se.wdl/#L275" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/theiacov/wf_theiacov_illumina_se.wdl" message = "wf_theiacov_illumina_se.wdl:276:28: error: type mismatch: expected type `Float?`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/theiacov/wf_theiacov_illumina_se.wdl/#L276" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/theiacov/wf_theiacov_illumina_se.wdl/#L276" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/theiacov/wf_theiacov_illumina_se.wdl" message = "wf_theiacov_illumina_se.wdl:277:37: error: type mismatch: expected type `Float?`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/theiacov/wf_theiacov_illumina_se.wdl/#L277" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/theiacov/wf_theiacov_illumina_se.wdl/#L277" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/theiacov/wf_theiacov_ont.wdl" message = "wf_theiacov_ont.wdl:236:30: error: type mismatch: expected type `String?`, but found type `Float?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/theiacov/wf_theiacov_ont.wdl/#L236" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/theiacov/wf_theiacov_ont.wdl/#L236" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/theiacov/wf_theiacov_ont.wdl" message = "wf_theiacov_ont.wdl:317:119: error: type mismatch: a type common to both type `Float?` and type `String` does not exist" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/theiacov/wf_theiacov_ont.wdl/#L317" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/theiacov/wf_theiacov_ont.wdl/#L317" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/theiacov/wf_theiacov_ont.wdl" message = "wf_theiacov_ont.wdl:317:37: error: type mismatch: expected type `String`, but found type `Float`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/theiacov/wf_theiacov_ont.wdl/#L317" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/theiacov/wf_theiacov_ont.wdl/#L317" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/theiacov/wf_theiacov_ont.wdl" message = "wf_theiacov_ont.wdl:317:84: error: type mismatch: a type common to both type `Float?` and type `String?` does not exist" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/theiacov/wf_theiacov_ont.wdl/#L317" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/theiacov/wf_theiacov_ont.wdl/#L317" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/theiacov/wf_theiacov_ont.wdl" message = "wf_theiacov_ont.wdl:431:145: error: type mismatch: a type common to both type `Float?` and type `String?` does not exist" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/theiacov/wf_theiacov_ont.wdl/#L431" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/theiacov/wf_theiacov_ont.wdl/#L431" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/theiacov/wf_theiacov_ont.wdl" message = "wf_theiacov_ont.wdl:431:180: error: type mismatch: a type common to both type `Float?` and type `String` does not exist" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/theiacov/wf_theiacov_ont.wdl/#L431" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/theiacov/wf_theiacov_ont.wdl/#L431" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/theiacov/wf_theiacov_ont.wdl" message = "wf_theiacov_ont.wdl:431:38: error: type mismatch: expected type `String`, but found type `Float`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/theiacov/wf_theiacov_ont.wdl/#L431" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/theiacov/wf_theiacov_ont.wdl/#L431" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/theiaeuk/wf_theiaeuk_illumina_pe.wdl" message = "wf_theiaeuk_illumina_pe.wdl:118:40: error: type mismatch: argument to function `select_first` expects type `Array[X]` where `X`: any optional type, but found type `Array[Int]+`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/theiaeuk/wf_theiaeuk_illumina_pe.wdl/#L118" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/theiaeuk/wf_theiaeuk_illumina_pe.wdl/#L118" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/theiaeuk/wf_theiaeuk_illumina_pe.wdl" message = "wf_theiaeuk_illumina_pe.wdl:127:40: error: type mismatch: argument to function `select_first` expects type `Array[X]` where `X`: any optional type, but found type `Array[Int]+`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/theiaeuk/wf_theiaeuk_illumina_pe.wdl/#L127" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/theiaeuk/wf_theiaeuk_illumina_pe.wdl/#L127" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/theiaeuk/wf_theiaeuk_illumina_pe.wdl" message = "wf_theiaeuk_illumina_pe.wdl:70:25: error: type mismatch: expected type `String`, but found type `Int`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/theiaeuk/wf_theiaeuk_illumina_pe.wdl/#L70" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/theiaeuk/wf_theiaeuk_illumina_pe.wdl/#L70" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/theiameta/wf_theiameta_illumina_pe.wdl" message = "wf_theiameta_illumina_pe.wdl:262:31: error: type mismatch: expected type `Float?`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/theiameta/wf_theiameta_illumina_pe.wdl/#L262" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/theiameta/wf_theiameta_illumina_pe.wdl/#L262" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/theiameta/wf_theiameta_illumina_pe.wdl" message = "wf_theiameta_illumina_pe.wdl:264:37: error: type mismatch: expected type `Float?`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/theiameta/wf_theiameta_illumina_pe.wdl/#L264" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/theiameta/wf_theiameta_illumina_pe.wdl/#L264" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/theiameta/wf_theiameta_illumina_pe.wdl" message = "wf_theiameta_illumina_pe.wdl:273:38: error: type mismatch: expected type `Float?`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/theiameta/wf_theiameta_illumina_pe.wdl/#L273" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/theiameta/wf_theiameta_illumina_pe.wdl/#L273" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/theiaprok/wf_theiaprok_illumina_pe.wdl" message = "wf_theiaprok_illumina_pe.wdl:115:27: error: type mismatch: expected type `String?`, but found type `Int`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/theiaprok/wf_theiaprok_illumina_pe.wdl/#L115" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/theiaprok/wf_theiaprok_illumina_pe.wdl/#L115" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/theiaprok/wf_theiaprok_illumina_se.wdl" message = "wf_theiaprok_illumina_se.wdl:110:27: error: type mismatch: expected type `String?`, but found type `Int`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/theiaprok/wf_theiaprok_illumina_se.wdl/#L110" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/theiaprok/wf_theiaprok_illumina_se.wdl/#L110" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/theiaprok/wf_theiaprok_ont.wdl" message = "wf_theiaprok_ont.wdl:103:28: error: type mismatch: expected type `String?`, but found type `Int`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/theiaprok/wf_theiaprok_ont.wdl/#L103" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/theiaprok/wf_theiaprok_ont.wdl/#L103" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/theiaprok/wf_theiaprok_ont.wdl" message = "wf_theiaprok_ont.wdl:84:25: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/theiaprok/wf_theiaprok_ont.wdl/#L84" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/theiaprok/wf_theiaprok_ont.wdl/#L84" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/data_import/wf_create_terra_table.wdl" message = "wf_create_terra_table.wdl:17:46: warning[UnusedCall]: unused call `make_table`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/data_import/wf_create_terra_table.wdl/#L17" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/data_import/wf_create_terra_table.wdl/#L17" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/data_import/wf_sra_fetch.wdl" message = "wf_sra_fetch.wdl:17:16: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/data_import/wf_sra_fetch.wdl/#L17" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/data_import/wf_sra_fetch.wdl/#L17" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/data_import/wf_sra_fetch.wdl" message = "wf_sra_fetch.wdl:18:19: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/data_import/wf_sra_fetch.wdl/#L18" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/data_import/wf_sra_fetch.wdl/#L18" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/data_import/wf_sra_fetch.wdl" message = "wf_sra_fetch.wdl:19:13: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/data_import/wf_sra_fetch.wdl/#L19" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/data_import/wf_sra_fetch.wdl/#L19" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/data_import/wf_sra_fetch.wdl" message = "wf_sra_fetch.wdl:20:16: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/data_import/wf_sra_fetch.wdl/#L20" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/data_import/wf_sra_fetch.wdl/#L20" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/data_import/wf_sra_fetch.wdl" message = "wf_sra_fetch.wdl:21:23: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/data_import/wf_sra_fetch.wdl/#L21" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/data_import/wf_sra_fetch.wdl/#L21" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/data_import/wf_terra_2_bq.wdl" message = "wf_terra_2_bq.wdl:14:26: warning[UnusedCall]: unused call `terra_to_bigquery`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/data_import/wf_terra_2_bq.wdl/#L14" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/data_import/wf_terra_2_bq.wdl/#L14" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:100:21: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L100" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L100" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:101:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L101" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L101" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:109:18: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L109" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L109" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:110:15: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L110" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L110" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:111:21: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L111" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L111" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:112:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L112" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L112" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:116:154: error: type mismatch: a type common to both type `Float?` and type `String` does not exist" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L116" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L116" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:116:94: error: type mismatch: a type common to both type `Float?` and type `String` does not exist" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L116" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L116" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:119:111: error: type mismatch: a type common to both type `Float?` and type `String` does not exist" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L119" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L119" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:119:189: error: type mismatch: a type common to both type `Float?` and type `String` does not exist" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L119" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L119" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:122:15: error: type mismatch: argument to function `defined` expects type `X` where `X`: any optional type, but found type `Array[File]`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L122" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L122" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:127:17: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L127" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L127" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:128:18: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L128" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L128" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:129:15: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L129" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L129" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:130:18: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L130" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L130" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:131:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L131" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L131" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:132:21: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L132" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L132" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:135:17: error: type mismatch: argument to function `defined` expects type `X` where `X`: any optional type, but found type `String`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L135" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L135" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:145:17: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L145" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L145" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:146:23: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L146" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L146" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:147:20: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L147" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L147" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:148:20: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L148" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L148" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:174:15: error: type mismatch: argument to function `defined` expects type `X` where `X`: any optional type, but found type `Array[File]`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L174" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L174" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:186:25: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L186" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L186" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:187:25: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L187" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L187" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:188:25: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L188" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L188" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:189:25: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L189" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L189" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:190:22: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L190" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L190" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:191:23: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L191" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L191" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:192:23: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L192" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L192" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:193:27: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L193" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L193" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:194:27: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L194" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L194" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:203:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L203" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L203" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:204:15: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L204" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L204" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:205:18: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L205" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L205" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:206:21: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L206" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L206" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:212:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L212" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L212" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:213:15: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L213" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L213" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:214:18: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L214" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L214" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:215:21: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L215" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L215" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:224:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L224" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L224" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:225:15: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L225" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L225" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:226:18: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L226" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L226" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:227:21: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L227" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L227" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:233:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L233" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L233" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:234:15: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L234" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L234" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:235:18: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L235" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L235" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:236:21: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L236" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L236" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:86:28: error: type mismatch: expected type `Boolean`, but found type `Boolean?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L86" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L86" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:87:16: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L87" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L87" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:88:16: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L88" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L88" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:89:13: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L89" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L89" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:90:19: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L90" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L90" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:98:18: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L98" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L98" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_flu_track.wdl" message = "wf_flu_track.wdl:99:15: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_flu_track.wdl/#L99" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_flu_track.wdl/#L99" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:102:16: error: type mismatch: expected type `Boolean`, but found type `Boolean?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L102" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L102" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:103:13: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L103" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L103" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:104:16: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L104" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L104" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:105:19: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L105" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L105" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:106:16: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L106" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L106" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:112:13: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L112" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L112" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:113:16: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L113" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L113" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:114:19: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L114" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L114" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:115:16: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L115" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L115" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:152:107: error: type mismatch: a type common to both type `Float?` and type `String` does not exist" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L152" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L152" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:152:29: error: type mismatch: expected type `String`, but found type `Float`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L152" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L152" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:153:104: error: type mismatch: a type common to both type `Float?` and type `String` does not exist" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L153" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L153" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:153:28: error: type mismatch: expected type `String`, but found type `Float`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L153" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L153" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:154:107: error: type mismatch: a type common to both type `Float?` and type `String` does not exist" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L154" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L154" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:154:37: error: type mismatch: expected type `String`, but found type `Float`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L154" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L154" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:158:144: error: type mismatch: a type common to both type `Float?` and type `String` does not exist" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L158" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L158" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:158:38: error: type mismatch: expected type `String`, but found type `Float`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L158" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L158" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:56:13: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L56" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L56" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:57:16: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L57" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L57" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:58:19: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L58" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L58" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:59:16: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L59" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L59" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:67:15: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L67" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L67" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:68:18: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L68" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L68" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:69:21: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L69" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L69" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:70:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L70" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L70" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:76:13: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L76" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L76" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:77:16: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L77" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L77" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:78:19: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L78" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L78" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:79:16: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L79" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L79" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:90:13: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L90" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L90" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:91:16: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L91" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L91" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:92:19: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L92" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L92" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_ivar_consensus.wdl" message = "wf_ivar_consensus.wdl:93:16: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_ivar_consensus.wdl/#L93" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_ivar_consensus.wdl/#L93" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:236:28: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L236" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L236" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:237:24: error: type mismatch: expected type `Float`, but found type `Float?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L237" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L237" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:238:24: error: type mismatch: expected type `Float`, but found type `Float?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L238" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L238" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:239:23: error: type mismatch: expected type `Float`, but found type `Float?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L239" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L239" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:240:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L240" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L240" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:249:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L249" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L249" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:258:20: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L258" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L258" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:259:23: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L259" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L259" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:260:17: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L260" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L260" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:261:20: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L261" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L261" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:262:30: error: type mismatch: expected type `Boolean`, but found type `Boolean?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L262" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L262" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:274:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L274" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L274" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:280:16: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L280" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L280" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:281:16: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L281" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L281" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:282:17: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L282" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L282" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:283:17: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L283" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L283" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:284:18: error: type mismatch: expected type `Boolean`, but found type `Boolean?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L284" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L284" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:285:25: error: type mismatch: expected type `Boolean`, but found type `Boolean?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L285" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L285" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:286:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L286" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L286" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:295:20: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L295" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L295" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:302:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L302" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L302" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:311:20: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L311" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L311" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:325:20: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L325" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L325" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:326:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L326" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L326" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:338:20: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L338" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L338" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:347:18: error: type mismatch: expected type `Float`, but found type `Float?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L347" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L347" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:348:19: error: type mismatch: expected type `Float`, but found type `Float?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L348" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L348" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:349:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L349" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L349" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:357:30: error: type mismatch: expected type `Boolean`, but found type `Boolean?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L357" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L357" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:358:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L358" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L358" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:359:15: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L359" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L359" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:360:18: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L360" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L360" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:361:21: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L361" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L361" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:370:20: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L370" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L370" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:378:20: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L378" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L378" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:388:20: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L388" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L388" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:398:27: error: type mismatch: expected type `Boolean`, but found type `Boolean?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L398" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L398" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:399:24: error: type mismatch: expected type `Boolean`, but found type `Boolean?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L399" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L399" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:400:24: error: type mismatch: expected type `Float`, but found type `Float?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L400" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L400" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:401:24: error: type mismatch: expected type `Float`, but found type `Float?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L401" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L401" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:402:33: error: type mismatch: expected type `Float`, but found type `Float?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L402" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L402" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:403:33: error: type mismatch: expected type `Float`, but found type `Float?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L403" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L403" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:404:34: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L404" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L404" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:405:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L405" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L405" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:413:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L413" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L413" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:421:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L421" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L421" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:429:22: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L429" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L429" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:430:24: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L430" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L430" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:431:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L431" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L431" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:442:22: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L442" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L442" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:453:32: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L453" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L453" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:454:20: error: type mismatch: expected type `Float`, but found type `Float?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L454" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L454" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:455:25: error: type mismatch: expected type `Float`, but found type `Float?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L455" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L455" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:456:23: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L456" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L456" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:457:20: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L457" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L457" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:458:28: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L458" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L458" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:460:20: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L460" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L460" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:476:32: error: type mismatch: expected type `Boolean`, but found type `Boolean?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L476" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L476" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:477:36: error: type mismatch: expected type `Boolean`, but found type `Boolean?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L477" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L477" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:478:22: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L478" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L478" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:488:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L488" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L488" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:496:21: error: type mismatch: expected type `Boolean`, but found type `Boolean?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L496" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L496" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:497:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L497" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L497" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:503:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L503" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L503" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:509:23: error: type mismatch: expected type `Boolean`, but found type `Boolean?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L509" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L509" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:510:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L510" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L510" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:520:20: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L520" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L520" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:527:22: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L527" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L527" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:528:24: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L528" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L528" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:529:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L529" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L529" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:536:27: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L536" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L536" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:537:27: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L537" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L537" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:538:20: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L538" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L538" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:539:22: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L539" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L539" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:540:32: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L540" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L540" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:541:32: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L541" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L541" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:542:25: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L542" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L542" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:543:30: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L543" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L543" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:544:25: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L544" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L544" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:545:25: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L545" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L545" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:546:26: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L546" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L546" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:547:30: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L547" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L547" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:548:37: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L548" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L548" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:549:31: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L549" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L549" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:550:39: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L550" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L550" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:551:20: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L551" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L551" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:560:14: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L560" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L560" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:561:28: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L561" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L561" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:562:18: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L562" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L562" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:563:25: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L563" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L563" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:564:20: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L564" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L564" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:565:22: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L565" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L565" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:566:15: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L566" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L566" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:567:23: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L567" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L567" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:568:20: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L568" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L568" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:569:20: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L569" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L569" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:570:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L570" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L570" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:578:20: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L578" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L578" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:587:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L587" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L587" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:602:20: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L602" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L602" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:611:18: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L611" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L611" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:622:23: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L622" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L622" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:623:24: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L623" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L623" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:624:34: error: type mismatch: expected type `String`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L624" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L624" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:625:24: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L625" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L625" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:626:34: error: type mismatch: expected type `String`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L626" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L626" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:627:24: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L627" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L627" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:628:34: error: type mismatch: expected type `String`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L628" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L628" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:629:24: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L629" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L629" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:630:34: error: type mismatch: expected type `String`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L630" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L630" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:631:24: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L631" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L631" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:632:34: error: type mismatch: expected type `String`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L632" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L632" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:633:20: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L633" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L633" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:644:28: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L644" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L644" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:648:22: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L648" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L648" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:656:22: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L656" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L656" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:695:28: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L695" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L695" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:699:22: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L699" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L699" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:707:22: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L707" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L707" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:721:28: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L721" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L721" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:725:22: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L725" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L725" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_merlin_magic.wdl" message = "wf_merlin_magic.wdl:733:22: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_merlin_magic.wdl/#L733" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_merlin_magic.wdl/#L733" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_read_QC_trim_ont.wdl" message = "wf_read_QC_trim_ont.wdl:109:25: error: type mismatch: expected type `String`, but found type `Int`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_read_QC_trim_ont.wdl/#L109" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_read_QC_trim_ont.wdl/#L109" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_read_QC_trim_ont.wdl" message = "wf_read_QC_trim_ont.wdl:51:22: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_read_QC_trim_ont.wdl/#L51" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_read_QC_trim_ont.wdl/#L51" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_read_QC_trim_ont.wdl" message = "wf_read_QC_trim_ont.wdl:52:22: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_read_QC_trim_ont.wdl/#L52" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_read_QC_trim_ont.wdl/#L52" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_read_QC_trim_ont.wdl" message = "wf_read_QC_trim_ont.wdl:53:22: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_read_QC_trim_ont.wdl/#L53" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_read_QC_trim_ont.wdl/#L53" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_read_QC_trim_ont.wdl" message = "wf_read_QC_trim_ont.wdl:89:23: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_read_QC_trim_ont.wdl/#L89" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_read_QC_trim_ont.wdl/#L89" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_read_QC_trim_ont.wdl" message = "wf_read_QC_trim_ont.wdl:90:20: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_read_QC_trim_ont.wdl/#L90" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_read_QC_trim_ont.wdl/#L90" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_read_QC_trim_ont.wdl" message = "wf_read_QC_trim_ont.wdl:91:17: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_read_QC_trim_ont.wdl/#L91" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_read_QC_trim_ont.wdl/#L91" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_read_QC_trim_pe.wdl" message = "wf_read_QC_trim_pe.wdl:129:22: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_read_QC_trim_pe.wdl/#L129" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_read_QC_trim_pe.wdl/#L129" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_read_QC_trim_pe.wdl" message = "wf_read_QC_trim_pe.wdl:141:23: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_read_QC_trim_pe.wdl/#L141" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_read_QC_trim_pe.wdl/#L141" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_read_QC_trim_pe.wdl" message = "wf_read_QC_trim_pe.wdl:142:20: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_read_QC_trim_pe.wdl/#L142" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_read_QC_trim_pe.wdl/#L142" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_read_QC_trim_pe.wdl" message = "wf_read_QC_trim_pe.wdl:143:17: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_read_QC_trim_pe.wdl/#L143" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_read_QC_trim_pe.wdl/#L143" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_read_QC_trim_pe.wdl" message = "wf_read_QC_trim_pe.wdl:74:28: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_read_QC_trim_pe.wdl/#L74" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_read_QC_trim_pe.wdl/#L74" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_read_QC_trim_se.wdl" message = "wf_read_QC_trim_se.wdl:118:22: error: type mismatch: expected type `File`, but found type `File?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_read_QC_trim_se.wdl/#L118" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_read_QC_trim_se.wdl/#L118" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_read_QC_trim_se.wdl" message = "wf_read_QC_trim_se.wdl:129:23: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_read_QC_trim_se.wdl/#L129" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_read_QC_trim_se.wdl/#L129" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_read_QC_trim_se.wdl" message = "wf_read_QC_trim_se.wdl:130:20: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_read_QC_trim_se.wdl/#L130" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_read_QC_trim_se.wdl/#L130" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_read_QC_trim_se.wdl" message = "wf_read_QC_trim_se.wdl:131:17: error: type mismatch: expected type `Int`, but found type `Int?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_read_QC_trim_se.wdl/#L131" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_read_QC_trim_se.wdl/#L131" [[diagnostics]] document = "theiagen/public_health_bioinformatics:/workflows/utilities/wf_read_QC_trim_se.wdl" message = "wf_read_QC_trim_se.wdl:56:28: error: type mismatch: expected type `String`, but found type `String?`" -permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/2669f994a90dc2c6d6703eef14cf3c639a7bfc1c/workflows/utilities/wf_read_QC_trim_se.wdl/#L56" +permalink = "https://github.com/theiagen/public_health_bioinformatics/blob/ad49a36614ab3a5a4713318c429ccd07f5486318/workflows/utilities/wf_read_QC_trim_se.wdl/#L56" diff --git a/gauntlet/src/lib.rs b/gauntlet/src/lib.rs index 817979a4e..6858ecada 100644 --- a/gauntlet/src/lib.rs +++ b/gauntlet/src/lib.rs @@ -312,7 +312,7 @@ pub async fn gauntlet(args: Args) -> Result<()> { }; report - .register(document_identifier, status, elapsed) + .register(document_identifier, status) .context("failed to register report status")?; } @@ -330,7 +330,7 @@ pub async fn gauntlet(args: Args) -> Result<()> { .next_section() .context("failed to transition to next report section")?; report - .footer(repository_identifier) + .footer(repository_identifier, elapsed) .context("failed to write report footer")?; report .next_section() diff --git a/gauntlet/src/report.rs b/gauntlet/src/report.rs index 44fd662f7..7a7695cca 100644 --- a/gauntlet/src/report.rs +++ b/gauntlet/src/report.rs @@ -176,7 +176,6 @@ impl Report { &mut self, identifier: document::Identifier, status: Status, - elapsed: Duration, ) -> std::io::Result<()> { if self.section != Section::Summary { panic!( @@ -185,7 +184,7 @@ impl Report { ); } - writeln!(self.inner, "{status} {identifier} ({elapsed:?})")?; + writeln!(self.inner, "{status} {identifier}")?; self.results.insert(identifier, status); self.printed = true; @@ -238,6 +237,7 @@ impl Report { pub fn footer( &mut self, repository_identifier: &repository::Identifier, + elapsed: Duration, ) -> std::io::Result<()> { if self.section != Section::Footer { panic!( @@ -292,7 +292,7 @@ impl Report { writeln!( self.inner, - " ({:.1}%)", + " ({:.1}%) analyzed in {elapsed:?}", (passed as f64 / considered as f64) * 100.0 )?; self.printed = true; diff --git a/wdl-analysis/CHANGELOG.md b/wdl-analysis/CHANGELOG.md index aa9d3ea59..8415c1143 100644 --- a/wdl-analysis/CHANGELOG.md +++ b/wdl-analysis/CHANGELOG.md @@ -21,6 +21,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Refactored expression type evaluator to provide context via a trait ([#249](https://github.com/stjude-rust-labs/wdl/pull/249)). * Removed `PartialEq`, `Eq`, and `Hash` from WDL-type-related types ([#249](https://github.com/stjude-rust-labs/wdl/pull/249)). +### Fixed + +* Static analysis of expressions within object literal members now takes place ([#254](https://github.com/stjude-rust-labs/wdl/pull/254)). +* Certain standard library functions with an existing constraint on generic + parameters that take structs are further constrained to take structs + containing only primitive members ([#254](https://github.com/stjude-rust-labs/wdl/pull/254)). +* Fixed signatures and minimum required versions for certain standard library + functions ([#254](https://github.com/stjude-rust-labs/wdl/pull/254)). + ## 0.5.0 - 10-22-2024 ### Changed diff --git a/wdl-analysis/src/stdlib.rs b/wdl-analysis/src/stdlib.rs index 333182389..643905319 100644 --- a/wdl-analysis/src/stdlib.rs +++ b/wdl-analysis/src/stdlib.rs @@ -1651,14 +1651,22 @@ pub struct StandardLibrary { types: Types, /// A map of function name to function definition. functions: IndexMap<&'static str, Function>, - /// The type for `Array[String]`. - pub(crate) array_string: Type, /// The type for `Array[Int]`. - pub(crate) array_int: Type, - /// The type for `Map[String, Int]`. - pub(crate) map_string_int: Type, + array_int: Type, + /// The type for `Array[String]`. + array_string: Type, + /// The type for `Array[File]`. + array_file: Type, + /// The type for `Array[Object]`. + array_object: Type, + /// The type for `Array[String]+`. + array_string_non_empty: Type, + /// The type for `Array[Array[String]]`. + array_array_string: Type, /// The type for `Map[String, String]`. - pub(crate) map_string_string: Type, + map_string_string: Type, + /// The type for `Map[String, Int]`. + map_string_int: Type, } impl StandardLibrary { @@ -1676,6 +1684,46 @@ impl StandardLibrary { pub fn functions(&self) -> impl ExactSizeIterator { self.functions.iter().map(|(n, f)| (*n, f)) } + + /// Gets the type for `Array[Int]`. + pub fn array_int_type(&self) -> Type { + self.array_int + } + + /// Gets the type for `Array[String]`. + pub fn array_string_type(&self) -> Type { + self.array_string + } + + /// Gets the type for `Array[File]`. + pub fn array_file_type(&self) -> Type { + self.array_file + } + + /// Gets the type for `Array[Object]`. + pub fn array_object_type(&self) -> Type { + self.array_object + } + + /// Gets the type for `Array[String]+`. + pub fn array_string_non_empty_type(&self) -> Type { + self.array_string_non_empty + } + + /// Gets the type for `Array[Array[String]]`. + pub fn array_array_string_type(&self) -> Type { + self.array_array_string + } + + /// Gets the type for `Map[String, String]`. + pub fn map_string_string_type(&self) -> Type { + self.map_string_string + } + + /// Gets the type for `Map[String, Int]`. + pub fn map_string_int_type(&self) -> Type { + self.map_string_int + } } /// Represents the WDL standard library. @@ -1958,6 +2006,15 @@ pub static STDLIB: LazyLock = LazyLock::new(|| { .insert( "size", PolymorphicFunction::new(vec![ + // This overload isn't explicitly in the spec, but it fixes an ambiguity in 1.2 + // when passed a literal `None` value. + FunctionSignature::builder() + .min_version(SupportedVersion::V1(V1::Two)) + .required(1) + .parameter(Type::None) + .parameter(PrimitiveTypeKind::String) + .ret(PrimitiveTypeKind::Float) + .build(), FunctionSignature::builder() .required(1) .parameter(PrimitiveType::optional(PrimitiveTypeKind::File)) @@ -1969,6 +2026,7 @@ pub static STDLIB: LazyLock = LazyLock::new(|| { // `String` overload is required as `String` may coerce to either `File` or // `Directory`, which is ambiguous. FunctionSignature::builder() + .min_version(SupportedVersion::V1(V1::Two)) .required(1) .parameter(PrimitiveType::optional(PrimitiveTypeKind::String)) .parameter(PrimitiveTypeKind::String) @@ -2131,11 +2189,13 @@ pub static STDLIB: LazyLock = LazyLock::new(|| { .ret(array_array_string) .build(), FunctionSignature::builder() + .min_version(SupportedVersion::V1(V1::Two)) .parameter(PrimitiveTypeKind::File) .parameter(PrimitiveTypeKind::Boolean) .ret(array_object) .build(), FunctionSignature::builder() + .min_version(SupportedVersion::V1(V1::Two)) .parameter(PrimitiveTypeKind::File) .parameter(PrimitiveTypeKind::Boolean) .parameter(array_string) @@ -2158,18 +2218,16 @@ pub static STDLIB: LazyLock = LazyLock::new(|| { .ret(PrimitiveTypeKind::File) .build(), FunctionSignature::builder() - .type_parameter("S", StructConstraint) - .parameter(GenericArrayType::new(GenericType::Parameter("S"))) - .ret(PrimitiveTypeKind::File) - .build(), - FunctionSignature::builder() + .min_version(SupportedVersion::V1(V1::Two)) .parameter(array_array_string) .parameter(PrimitiveTypeKind::Boolean) .parameter(array_string) .ret(PrimitiveTypeKind::File) .build(), FunctionSignature::builder() - .type_parameter("S", StructConstraint) + .min_version(SupportedVersion::V1(V1::Two)) + .type_parameter("S", PrimitiveStructConstraint) + .required(1) .parameter(GenericArrayType::new(GenericType::Parameter("S"))) .parameter(PrimitiveTypeKind::Boolean) .parameter(array_string) @@ -2289,7 +2347,8 @@ pub static STDLIB: LazyLock = LazyLock::new(|| { .ret(PrimitiveTypeKind::File) .build(), FunctionSignature::builder() - .type_parameter("S", StructConstraint) + .min_version(SupportedVersion::V1(V1::One)) + .type_parameter("S", PrimitiveStructConstraint) .parameter(GenericType::Parameter("S")) .ret(PrimitiveTypeKind::File) .build(), @@ -2310,7 +2369,8 @@ pub static STDLIB: LazyLock = LazyLock::new(|| { .ret(PrimitiveTypeKind::File) .build(), FunctionSignature::builder() - .type_parameter("S", StructConstraint) + .min_version(SupportedVersion::V1(V1::One)) + .type_parameter("S", PrimitiveStructConstraint) .parameter(GenericArrayType::new(GenericType::Parameter("S"))) .ret(PrimitiveTypeKind::File) .build(), @@ -2853,10 +2913,14 @@ pub static STDLIB: LazyLock = LazyLock::new(|| { StandardLibrary { types, functions, - array_string, array_int, - map_string_int, + array_string, + array_file, + array_object, + array_string_non_empty, + array_array_string, map_string_string, + map_string_int, } }); @@ -2912,6 +2976,7 @@ mod test { "join_paths(File, Array[String]+) -> File", "join_paths(Array[String]+) -> File", "glob(String) -> Array[File]", + "size(None, ) -> Float", "size(File?, ) -> Float", "size(String?, ) -> Float", "size(Directory?, ) -> Float", @@ -2929,9 +2994,9 @@ mod test { "read_tsv(File, Boolean) -> Array[Object]", "read_tsv(File, Boolean, Array[String]) -> Array[Object]", "write_tsv(Array[Array[String]]) -> File", - "write_tsv(Array[S]) -> File where `S`: any structure", "write_tsv(Array[Array[String]], Boolean, Array[String]) -> File", - "write_tsv(Array[S], Boolean, Array[String]) -> File where `S`: any structure", + "write_tsv(Array[S], , ) -> File where `S`: any structure \ + containing only primitive types", "read_map(File) -> Map[String, String]", "write_map(Map[String, String]) -> File", "read_json(File) -> Union", @@ -2939,9 +3004,10 @@ mod test { "read_object(File) -> Object", "read_objects(File) -> Array[Object]", "write_object(Object) -> File", - "write_object(S) -> File where `S`: any structure", + "write_object(S) -> File where `S`: any structure containing only primitive types", "write_objects(Array[Object]) -> File", - "write_objects(Array[S]) -> File where `S`: any structure", + "write_objects(Array[S]) -> File where `S`: any structure containing only primitive \ + types", "prefix(String, Array[P]) -> Array[String] where `P`: any required primitive type", "suffix(String, Array[P]) -> Array[String] where `P`: any required primitive type", "quote(Array[P]) -> Array[String] where `P`: any required primitive type", diff --git a/wdl-analysis/src/stdlib/constraints.rs b/wdl-analysis/src/stdlib/constraints.rs index 0afc21e33..dc0f744f2 100644 --- a/wdl-analysis/src/stdlib/constraints.rs +++ b/wdl-analysis/src/stdlib/constraints.rs @@ -2,6 +2,7 @@ use std::fmt; +use crate::types::Coercible; use crate::types::CompoundType; use crate::types::CompoundTypeDef; use crate::types::Optional; @@ -114,6 +115,27 @@ impl Constraint for StructConstraint { } } +/// Represents a constraint that ensures the type is any structure that contains +/// only primitive types. +#[derive(Debug, Copy, Clone)] +pub struct PrimitiveStructConstraint; + +impl Constraint for PrimitiveStructConstraint { + fn description(&self) -> &'static str { + "any structure containing only primitive types" + } + + fn satisfied(&self, types: &Types, ty: Type) -> bool { + if let Type::Compound(ty) = ty { + if let CompoundTypeDef::Struct(s) = types.type_definition(ty.definition()) { + return s.members().values().all(|ty| ty.as_primitive().is_some()); + } + } + + false + } +} + /// Represents a constraint that ensures the type is JSON serializable. #[derive(Debug, Copy, Clone)] pub struct JsonSerializableConstraint; @@ -130,8 +152,8 @@ impl Constraint for JsonSerializableConstraint { CompoundTypeDef::Array(ty) => type_is_serializable(types, ty.element_type()), CompoundTypeDef::Pair(_) => false, CompoundTypeDef::Map(ty) => { - !ty.key_type().is_optional() - && matches!(ty.key_type(), Type::Primitive(ty) if ty.kind() == PrimitiveTypeKind::String) + ty.key_type() + .is_coercible_to(types, &PrimitiveTypeKind::String.into()) && type_is_serializable(types, ty.value_type()) } CompoundTypeDef::Struct(s) => s diff --git a/wdl-analysis/src/types/v1.rs b/wdl-analysis/src/types/v1.rs index 80683c2d7..7bc526d13 100644 --- a/wdl-analysis/src/types/v1.rs +++ b/wdl-analysis/src/types/v1.rs @@ -23,6 +23,7 @@ use wdl_ast::v1::LiteralHints; use wdl_ast::v1::LiteralInput; use wdl_ast::v1::LiteralMap; use wdl_ast::v1::LiteralMapItem; +use wdl_ast::v1::LiteralObject; use wdl_ast::v1::LiteralOutput; use wdl_ast::v1::LiteralPair; use wdl_ast::v1::LiteralStruct; @@ -93,8 +94,8 @@ pub fn task_member_type(name: &str) -> Option { "name" | "id" | "container" => Some(PrimitiveTypeKind::String.into()), "cpu" => Some(PrimitiveTypeKind::Float.into()), "memory" | "attempt" => Some(PrimitiveTypeKind::Integer.into()), - "gpu" | "fpga" => Some(STDLIB.array_string), - "disks" => Some(STDLIB.map_string_int), + "gpu" | "fpga" => Some(STDLIB.array_string_type()), + "disks" => Some(STDLIB.map_string_int_type()), "end_time" | "return_code" => Some(Type::from(PrimitiveTypeKind::Integer).optional()), "meta" | "parameter_meta" | "ext" => Some(Type::Object), _ => None, @@ -107,7 +108,7 @@ pub fn task_member_type(name: &str) -> Option { pub fn task_requirement_types(version: SupportedVersion, name: &str) -> Option<&'static [Type]> { /// The types for the `container` requirement. static CONTAINER_TYPES: LazyLock> = - LazyLock::new(|| Box::new([PrimitiveTypeKind::String.into(), STDLIB.array_string])); + LazyLock::new(|| Box::new([PrimitiveTypeKind::String.into(), STDLIB.array_string_type()])); /// The types for the `cpu` requirement. const CPU_TYPES: &[Type] = &[ Type::Primitive(PrimitiveType::new(PrimitiveTypeKind::Integer)), @@ -131,7 +132,7 @@ pub fn task_requirement_types(version: SupportedVersion, name: &str) -> Option<& Box::new([ PrimitiveTypeKind::Integer.into(), PrimitiveTypeKind::String.into(), - STDLIB.array_string, + STDLIB.array_string_type(), ]) }); /// The types for the `max_retries` requirement. @@ -143,7 +144,7 @@ pub fn task_requirement_types(version: SupportedVersion, name: &str) -> Option<& Box::new([ PrimitiveTypeKind::Integer.into(), PrimitiveTypeKind::String.into(), - STDLIB.array_int, + STDLIB.array_int_type(), ]) }); @@ -171,8 +172,12 @@ pub fn task_hint_types( use_hidden_types: bool, ) -> Option<&'static [Type]> { /// The types for the `disks` hint. - static DISKS_TYPES: LazyLock> = - LazyLock::new(|| Box::new([PrimitiveTypeKind::String.into(), STDLIB.map_string_string])); + static DISKS_TYPES: LazyLock> = LazyLock::new(|| { + Box::new([ + PrimitiveTypeKind::String.into(), + STDLIB.map_string_string_type(), + ]) + }); /// The types for the `fpga` hint. const FPGA_TYPES: &[Type] = &[ Type::Primitive(PrimitiveType::new(PrimitiveTypeKind::Integer)), @@ -597,7 +602,7 @@ impl<'a, C: EvaluationContext> ExprTypeEvaluator<'a, C> { LiteralExpr::Array(expr) => Some(self.evaluate_literal_array(expr)), LiteralExpr::Pair(expr) => Some(self.evaluate_literal_pair(expr)), LiteralExpr::Map(expr) => Some(self.evaluate_literal_map(expr)), - LiteralExpr::Object(_) => Some(Type::Object), + LiteralExpr::Object(expr) => Some(self.evaluate_literal_object(expr)), LiteralExpr::Struct(expr) => self.evaluate_literal_struct(expr), LiteralExpr::None(_) => Some(Type::None), LiteralExpr::Hints(expr) => self.evaluate_literal_hints(expr), @@ -786,6 +791,17 @@ impl<'a, C: EvaluationContext> ExprTypeEvaluator<'a, C> { } } + /// Evaluates the type of a literal object expression. + fn evaluate_literal_object(&mut self, expr: &LiteralObject) -> Type { + // Validate the member expressions + for item in expr.items() { + let (_, v) = item.name_value(); + self.evaluate_expr(&v); + } + + Type::Object + } + /// Evaluates the type of a literal struct expression. fn evaluate_literal_struct(&mut self, expr: &LiteralStruct) -> Option { let name = expr.name(); diff --git a/wdl-analysis/tests/analysis/primitive-type-structs/source.diagnostics b/wdl-analysis/tests/analysis/primitive-type-structs/source.diagnostics new file mode 100644 index 000000000..17981764d --- /dev/null +++ b/wdl-analysis/tests/analysis/primitive-type-structs/source.diagnostics @@ -0,0 +1,6 @@ +error: type mismatch: argument to function `write_tsv` expects type `Array[Array[String]]` or `Array[S]` where `S`: any structure containing only primitive types, but found type `Array[Bar]+` + ┌─ tests/analysis/primitive-type-structs/source.wdl:18:26 + │ +18 │ File bad = write_tsv([Bar { foo: Foo { foo: "hi" } }]) + │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this is type `Array[Bar]+` + diff --git a/wdl-analysis/tests/analysis/primitive-type-structs/source.wdl b/wdl-analysis/tests/analysis/primitive-type-structs/source.wdl new file mode 100644 index 000000000..3f862b4b6 --- /dev/null +++ b/wdl-analysis/tests/analysis/primitive-type-structs/source.wdl @@ -0,0 +1,24 @@ +## This is a test of the primitive type structs constraint. + +version 1.2 + +struct Foo { + String foo +} + +struct Bar { + Foo foo +} + +workflow test { + # This is OK as the struct contains only primitive members + File ok = write_tsv([Foo { foo: "hi" }]) + + # This is not OK as the struct contains a compound member + File bad = write_tsv([Bar { foo: Foo { foo: "hi" } }]) + + output { + File o1 = ok + File o2 = bad + } +} diff --git a/wdl-engine/CHANGELOG.md b/wdl-engine/CHANGELOG.md index ef560cf33..99a60402a 100644 --- a/wdl-engine/CHANGELOG.md +++ b/wdl-engine/CHANGELOG.md @@ -9,6 +9,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +* Replaced the `Value::from_json` method with `Value::deserialize` which allows + for deserialization from any self-describing data format; a method for + serializing a value was also added ([#254](https://github.com/stjude-rust-labs/wdl/pull/254)). +* Implemented the file functions from the WDL standard library ([#254](https://github.com/stjude-rust-labs/wdl/pull/254)). * Implemented the string functions from the WDL standard library ([#252](https://github.com/stjude-rust-labs/wdl/pull/252)). * Implemented call evaluation and the numeric functions from the WDL standard library ([#251](https://github.com/stjude-rust-labs/wdl/pull/251)). diff --git a/wdl-engine/Cargo.toml b/wdl-engine/Cargo.toml index 77d4e31e2..e47b5ba99 100644 --- a/wdl-engine/Cargo.toml +++ b/wdl-engine/Cargo.toml @@ -11,6 +11,7 @@ description = "Execution engine for Workflow Description Language (WDL) document documentation = "https://docs.rs/wdl-engine" [dependencies] +wdl-grammar = { version = "0.10.0", path = "../wdl-grammar" } wdl-ast = { version = "0.9.0", path = "../wdl-ast" } wdl-analysis = { version = "0.5.0", path = "../wdl-analysis" } anyhow = { workspace = true } @@ -18,15 +19,17 @@ ordered-float = { workspace = true } indexmap = { workspace = true } serde_json = { workspace = true } regex = { workspace = true } +glob = { workspace = true } +tempfile = { workspace = true } +itertools = { workspace = true } +serde = { workspace = true } [dev-dependencies] -wdl-grammar = { version = "0.10.0", path = "../wdl-grammar" } tokio = { workspace = true } pretty_assertions = { workspace = true } codespan-reporting = { workspace = true } path-clean = { workspace = true } colored = { workspace = true } -tempfile = { workspace = true } approx = { workspace = true } [lints] diff --git a/wdl-engine/src/diagnostics.rs b/wdl-engine/src/diagnostics.rs index bf4940f80..42e253337 100644 --- a/wdl-engine/src/diagnostics.rs +++ b/wdl-engine/src/diagnostics.rs @@ -1,5 +1,7 @@ //! Module for evaluation diagnostics. +use std::fmt; + use wdl_analysis::types::Type; use wdl_analysis::types::Types; use wdl_ast::AstToken; @@ -153,3 +155,41 @@ pub fn multiline_string_requirement(span: Span) -> Diagnostic { pub fn invalid_regex(error: ®ex::Error, span: Span) -> Diagnostic { Diagnostic::error(error.to_string()).with_highlight(span) } + +/// Creates a "path not relative" diagnostic. +pub fn path_not_relative(span: Span) -> Diagnostic { + Diagnostic::error("path is required to be a relative path, but an absolute path was provided") + .with_highlight(span) +} + +/// Creates an "array path not relative" diagnostic. +pub fn array_path_not_relative(index: usize, span: Span) -> Diagnostic { + Diagnostic::error(format!( + "index {index} of the array is required to be a relative path, but an absolute path was \ + provided" + )) + .with_highlight(span) +} + +/// Creates an "invalid glob pattern" diagnostic. +pub fn invalid_glob_pattern(error: &glob::PatternError, span: Span) -> Diagnostic { + Diagnostic::error(format!( + "invalid glob pattern specified: {error}", + error = error.msg + )) + .with_highlight(span) +} + +/// Creates an "invalid storage unit" diagnostic. +pub fn invalid_storage_unit(unit: &str, span: Span) -> Diagnostic { + Diagnostic::error(format!( + "invalid storage unit `{unit}`; supported units are `B`, `KB`, `K`, `MB`, `M`, `GB`, `G`, \ + `TB`, `T`, `KiB`, `Ki`, `MiB`, `Mi`, `GiB`, `Gi`, `TiB`, and `Ti`", + )) + .with_highlight(span) +} + +/// Creates a "function call failed" diagnostic. +pub fn function_call_failed(name: &str, error: impl fmt::Display, span: Span) -> Diagnostic { + Diagnostic::error(format!("call to function `{name}` failed: {error}")).with_highlight(span) +} diff --git a/wdl-engine/src/eval.rs b/wdl-engine/src/eval.rs index 5a34cbd99..694a5ee2e 100644 --- a/wdl-engine/src/eval.rs +++ b/wdl-engine/src/eval.rs @@ -1,11 +1,52 @@ //! Module for expression evaluation. +use std::path::Path; + use indexmap::IndexMap; +use wdl_analysis::types::Type; +use wdl_analysis::types::Types; +use wdl_ast::Diagnostic; +use wdl_ast::Ident; +use wdl_ast::SupportedVersion; use crate::Value; pub mod v1; +/// Represents context to an expression evaluator. +pub trait EvaluationContext { + /// Gets the supported version of the document being evaluated. + fn version(&self) -> SupportedVersion; + + /// Gets the types collection associated with the evaluation. + fn types(&self) -> &Types; + + /// Gets the mutable types collection associated with the evaluation. + fn types_mut(&mut self) -> &mut Types; + + /// Gets the value of the given name in scope. + fn resolve_name(&self, name: &Ident) -> Result; + + /// Resolves a type name to a type. + fn resolve_type_name(&self, name: &Ident) -> Result; + + /// Gets the current working directory for the evaluation. + fn cwd(&self) -> &Path; + + /// Gets the temp directory for the evaluation. + fn tmp(&self) -> &Path; + + /// Gets the value to return for a call to the `stdout` function. + /// + /// This is `Some` only when evaluating task outputs. + fn stdout(&self) -> Option; + + /// Gets the value to return for a call to the `stderr` function. + /// + /// This is `Some` only when evaluating task outputs. + fn stderr(&self) -> Option; +} + /// Represents an index of a scope in a collection of scopes. #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct ScopeIndex(usize); diff --git a/wdl-engine/src/eval/v1.rs b/wdl-engine/src/eval/v1.rs index 679b73b28..bca770156 100644 --- a/wdl-engine/src/eval/v1.rs +++ b/wdl-engine/src/eval/v1.rs @@ -40,7 +40,6 @@ use wdl_analysis::types::PairType; use wdl_analysis::types::PrimitiveTypeKind; use wdl_analysis::types::Type; use wdl_analysis::types::TypeEq; -use wdl_analysis::types::Types; use wdl_analysis::types::v1::ComparisonOperator; use wdl_analysis::types::v1::ExprTypeEvaluator; use wdl_analysis::types::v1::NumericOperator; @@ -48,7 +47,6 @@ use wdl_ast::AstNode; use wdl_ast::AstNodeExt; use wdl_ast::AstToken; use wdl_ast::Diagnostic; -use wdl_ast::Ident; use wdl_ast::Span; use wdl_ast::SupportedVersion; use wdl_ast::SyntaxKind; @@ -75,6 +73,7 @@ use wdl_ast::v1::StringPart; use wdl_ast::v1::StrippedStringPart; use wdl_ast::version::V1; +use super::EvaluationContext; use crate::Array; use crate::Coercible; use crate::CompoundValue; @@ -96,36 +95,10 @@ use crate::diagnostics::multiline_string_requirement; use crate::diagnostics::not_an_object_member; use crate::diagnostics::numeric_overflow; use crate::diagnostics::struct_member_coercion_failed; +use crate::stdlib::CallArgument; +use crate::stdlib::CallContext; use crate::stdlib::STDLIB; -/// Represents context to an expression evaluator. -pub trait EvaluationContext { - /// Gets the supported version of the document being evaluated. - fn version(&self) -> SupportedVersion; - - /// Gets the types collection associated with the evaluation. - fn types(&self) -> &Types; - - /// Gets the mutable types collection associated with the evaluation. - fn types_mut(&mut self) -> &mut Types; - - /// Gets the value of the given name in scope. - fn resolve_name(&self, name: &Ident) -> Result; - - /// Resolves a type name to a type. - fn resolve_type_name(&self, name: &Ident) -> Result; - - /// Gets the value to return for a call to the `stdout` function. - /// - /// This is `Some` only when evaluating task outputs. - fn stdout(&self) -> Option; - - /// Gets the value to return for a call to the `stderr` function. - /// - /// This is `Some` only when evaluating task outputs. - fn stderr(&self) -> Option; -} - /// Represents a WDL expression evaluator. #[derive(Debug)] pub struct ExprEvaluator<'a, C> { @@ -1064,12 +1037,12 @@ impl<'a, C: EvaluationContext> ExprEvaluator<'a, C> { // Evaluate the argument expressions let mut count = 0; let mut types = [Type::Union; MAX_PARAMETERS]; - let mut arguments = [const { (Value::None, Span::new(0, 0)) }; MAX_PARAMETERS]; + let mut arguments = [const { CallArgument::none() }; MAX_PARAMETERS]; for arg in expr.arguments() { if count < MAX_PARAMETERS { let v = self.evaluate_expr(&arg)?; types[count] = v.ty(); - arguments[count] = (v, arg.span()); + arguments[count] = CallArgument::new(v, arg.span()); } count += 1; @@ -1080,10 +1053,19 @@ impl<'a, C: EvaluationContext> ExprEvaluator<'a, C> { let arguments = &arguments[..count.min(MAX_PARAMETERS)]; if count <= MAX_PARAMETERS { match f.bind(self.context.version(), self.context.types_mut(), types) { - Ok(binding) => STDLIB - .get(target.as_str()) - .expect("should have implementation") - .call(binding, self.context.types(), arguments), + Ok(binding) => { + let context = CallContext::new( + self.context, + target.span(), + arguments, + binding.return_type(), + ); + + STDLIB + .get(target.as_str()) + .expect("should have implementation") + .call(binding, context) + } Err(FunctionBindError::RequiresVersion(minimum)) => Err( unsupported_function(minimum, target.as_str(), target.span()), ), @@ -1242,11 +1224,16 @@ impl<'a, C: EvaluationContext> ExprEvaluator<'a, C> { #[cfg(test)] pub(crate) mod test { use std::collections::HashMap; + use std::fs; + use std::path::Path; use pretty_assertions::assert_eq; + use tempfile::TempDir; use wdl_analysis::diagnostics::unknown_name; use wdl_analysis::diagnostics::unknown_type; use wdl_analysis::types::StructType; + use wdl_analysis::types::Types; + use wdl_ast::Ident; use wdl_grammar::construct_tree; use wdl_grammar::grammar::v1; use wdl_grammar::lexer::Lexer; @@ -1255,17 +1242,71 @@ pub(crate) mod test { use crate::ScopeRef; use crate::eval::Scope; + /// Represents a test environment. + pub struct TestEnv { + /// The types collection for the test. + types: Types, + /// The scopes for the test. + scopes: Vec, + /// The structs for the test. + structs: HashMap<&'static str, Type>, + /// The temporary directory. + tmp: TempDir, + /// The current directory. + cwd: TempDir, + } + + impl TestEnv { + pub fn types(&self) -> &Types { + &self.types + } + + pub fn types_mut(&mut self) -> &mut Types { + &mut self.types + } + + pub fn scope(&self) -> ScopeRef<'_> { + ScopeRef::new(&self.scopes, 0) + } + + pub fn insert_name(&mut self, name: impl Into, value: impl Into) { + self.scopes[0].insert(name, value); + } + + pub fn insert_struct(&mut self, name: &'static str, ty: impl Into) { + self.structs.insert(name, ty.into()); + } + + pub fn cwd(&self) -> &Path { + self.cwd.path() + } + + pub fn tmp(&self) -> &Path { + self.tmp.path() + } + + pub fn write_file(&self, name: &str, bytes: impl AsRef<[u8]>) { + fs::write(self.cwd().join(name), bytes).expect("failed to create temp file"); + } + } + + impl Default for TestEnv { + fn default() -> Self { + Self { + types: Default::default(), + scopes: vec![Scope::new(None)], + structs: Default::default(), + tmp: TempDir::new().expect("failed to create temp directory"), + cwd: TempDir::new().expect("failed to create temp directory"), + } + } + } + /// Represents test evaluation context to an expression evaluator. - #[derive(Debug)] pub struct TestEvaluationContext<'a> { - /// The types collection. - types: &'a mut Types, + env: &'a mut TestEnv, /// The supported version of WDL being evaluated. version: SupportedVersion, - /// The map of known struct types. - structs: HashMap<&'static str, Type>, - /// The current evaluation scope. - scope: ScopeRef<'a>, /// The stdout value from a task's execution. stdout: Option, /// The stderr value from a task's execution. @@ -1273,17 +1314,26 @@ pub(crate) mod test { } impl<'a> TestEvaluationContext<'a> { - /// Constructs a test evaluation context. - pub fn new(version: SupportedVersion, types: &'a mut Types, scope: ScopeRef<'a>) -> Self { + pub fn new(env: &'a mut TestEnv, version: SupportedVersion) -> Self { Self { - types, + env, version, - structs: HashMap::new(), - scope, stdout: None, stderr: None, } } + + /// Sets the stdout to use for the evaluation context. + pub fn with_stdout(mut self, stdout: impl Into) -> Self { + self.stdout = Some(stdout.into()); + self + } + + /// Sets the stderr to use for the evaluation context. + pub fn with_stderr(mut self, stderr: impl Into) -> Self { + self.stderr = Some(stderr.into()); + self + } } impl EvaluationContext for TestEvaluationContext<'_> { @@ -1292,27 +1342,37 @@ pub(crate) mod test { } fn types(&self) -> &Types { - &self.types + &self.env.types } fn types_mut(&mut self) -> &mut Types { - &mut self.types + &mut self.env.types } fn resolve_name(&self, name: &Ident) -> Result { - self.scope + self.env + .scope() .lookup(name.as_str()) .map(|v| v.clone()) .ok_or_else(|| unknown_name(name.as_str(), name.span())) } fn resolve_type_name(&self, name: &Ident) -> Result { - self.structs + self.env + .structs .get(name.as_str()) .copied() .ok_or_else(|| unknown_type(name.as_str(), name.span())) } + fn cwd(&self) -> &Path { + self.env.cwd() + } + + fn tmp(&self) -> &Path { + self.env.tmp() + } + fn stdout(&self) -> Option { self.stdout.clone() } @@ -1322,25 +1382,31 @@ pub(crate) mod test { } } - /// Evaluates a WDL v1 expression and returns the value or a - /// parse/evaluation diagnostic. - pub fn eval_v1_expr( + pub fn eval_v1_expr(env: &mut TestEnv, version: V1, source: &str) -> Result { + eval_v1_expr_with_context( + TestEvaluationContext::new(env, SupportedVersion::V1(version)), + source, + ) + } + + pub fn eval_v1_expr_with_stdio( + env: &mut TestEnv, version: V1, source: &str, - types: &mut Types, - scope: ScopeRef<'_>, + stdout: impl Into, + stderr: impl Into, ) -> Result { eval_v1_expr_with_context( + TestEvaluationContext::new(env, SupportedVersion::V1(version)) + .with_stdout(stdout) + .with_stderr(stderr), source, - &mut TestEvaluationContext::new(SupportedVersion::V1(version), types, scope), ) } - /// Evaluates a WDL v1 expression and returns the value or a - /// parse/evaluation diagnostic. fn eval_v1_expr_with_context( + mut context: TestEvaluationContext<'_>, source: &str, - context: &mut TestEvaluationContext<'_>, ) -> Result { let source = source.trim(); let mut parser = v1::Parser::new(Lexer::new(source)); @@ -1360,7 +1426,8 @@ pub(crate) mod test { ); let expr = Expr::cast(construct_tree(source, output.events)) .expect("should be an expression"); - let mut evaluator = ExprEvaluator::new(context); + + let mut evaluator = ExprEvaluator::new(&mut context); evaluator.evaluate_expr(&expr) } Err((marker, diagnostic)) => { @@ -1372,58 +1439,49 @@ pub(crate) mod test { #[test] fn literal_none_expr() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let value = eval_v1_expr(V1::Two, "None", &mut types, scope).unwrap(); + let mut env = TestEnv::default(); + let value = eval_v1_expr(&mut env, V1::Two, "None").unwrap(); assert_eq!(value.to_string(), "None"); } #[test] fn literal_bool_expr() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let value = eval_v1_expr(V1::Two, "true", &mut types, scope).unwrap(); + let mut env = TestEnv::default(); + let value = eval_v1_expr(&mut env, V1::Two, "true").unwrap(); assert_eq!(value.unwrap_boolean(), true); - let value = eval_v1_expr(V1::Two, "false", &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, "false").unwrap(); assert_eq!(value.unwrap_boolean(), false); } #[test] fn literal_int_expr() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let value = eval_v1_expr(V1::Two, "12345", &mut types, scope).unwrap(); + let mut env = TestEnv::default(); + let value = eval_v1_expr(&mut env, V1::Two, "12345").unwrap(); assert_eq!(value.unwrap_integer(), 12345); - let value = eval_v1_expr(V1::Two, "-54321", &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, "-54321").unwrap(); assert_eq!(value.unwrap_integer(), -54321); - let value = eval_v1_expr(V1::Two, "0xdeadbeef", &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, "0xdeadbeef").unwrap(); assert_eq!(value.unwrap_integer(), 0xDEADBEEF); - let value = eval_v1_expr(V1::Two, "0777", &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, "0777").unwrap(); assert_eq!(value.unwrap_integer(), 0o777); - let value = eval_v1_expr(V1::Two, "-9223372036854775808", &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, "-9223372036854775808").unwrap(); assert_eq!(value.unwrap_integer(), -9223372036854775808); - let diagnostic = eval_v1_expr(V1::Two, "9223372036854775808", &mut types, scope) - .expect_err("should fail"); + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "9223372036854775808").expect_err("should fail"); assert_eq!( diagnostic.message(), "literal integer exceeds the range for a 64-bit signed integer \ (-9223372036854775808..=9223372036854775807)" ); - let diagnostic = eval_v1_expr(V1::Two, "-9223372036854775809", &mut types, scope) - .expect_err("should fail"); + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "-9223372036854775809").expect_err("should fail"); assert_eq!( diagnostic.message(), "literal integer exceeds the range for a 64-bit signed integer \ @@ -1433,35 +1491,29 @@ pub(crate) mod test { #[test] fn literal_float_expr() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let value = eval_v1_expr(V1::Two, "12345.6789", &mut types, scope).unwrap(); + let mut env = TestEnv::default(); + let value = eval_v1_expr(&mut env, V1::Two, "12345.6789").unwrap(); approx::assert_relative_eq!(value.unwrap_float(), 12345.6789); - let mut types = Types::default(); - let value = eval_v1_expr(V1::Two, "-12345.6789", &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, "-12345.6789").unwrap(); approx::assert_relative_eq!(value.unwrap_float(), -12345.6789); - let mut types = Types::default(); - let value = eval_v1_expr(V1::Two, "1.7976931348623157E+308", &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, "1.7976931348623157E+308").unwrap(); approx::assert_relative_eq!(value.unwrap_float(), 1.7976931348623157E+308); - let mut types = Types::default(); - let value = eval_v1_expr(V1::Two, "-1.7976931348623157E+308", &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, "-1.7976931348623157E+308").unwrap(); approx::assert_relative_eq!(value.unwrap_float(), -1.7976931348623157E+308); - let diagnostic = eval_v1_expr(V1::Two, "2.7976931348623157E+308", &mut types, scope) - .expect_err("should fail"); + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "2.7976931348623157E+308").expect_err("should fail"); assert_eq!( diagnostic.message(), "literal float exceeds the range for a 64-bit float \ (-1.7976931348623157e308..=+1.7976931348623157e308)" ); - let diagnostic = eval_v1_expr(V1::Two, "-2.7976931348623157E+308", &mut types, scope) - .expect_err("should fail"); + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "-2.7976931348623157E+308").expect_err("should fail"); assert_eq!( diagnostic.message(), "literal float exceeds the range for a 64-bit float \ @@ -1471,24 +1523,20 @@ pub(crate) mod test { #[test] fn literal_string_expr() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let value = eval_v1_expr(V1::Two, "'hello\nworld'", &mut types, scope).unwrap(); + let mut env = TestEnv::default(); + let value = eval_v1_expr(&mut env, V1::Two, "'hello\nworld'").unwrap(); assert_eq!(value.unwrap_string().as_str(), "hello\nworld"); - let value = eval_v1_expr(V1::Two, r#""hello world""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, r#""hello world""#).unwrap(); assert_eq!(value.unwrap_string().as_str(), "hello world"); let value = eval_v1_expr( + &mut env, V1::Two, r#"<<< hello \ world >>>"#, - &mut types, - scope, ) .unwrap(); assert_eq!(value.unwrap_string().as_str(), "hello world"); @@ -1496,87 +1544,70 @@ pub(crate) mod test { #[test] fn string_placeholders() { - let mut root_scope = Scope::new(None); - root_scope.insert("str", PrimitiveValue::new_string("foo")); - root_scope.insert("file", PrimitiveValue::new_file("bar")); - root_scope.insert("dir", PrimitiveValue::new_directory("baz")); - root_scope.insert("salutation", PrimitiveValue::new_string("hello")); - root_scope.insert("name1", Value::None); - root_scope.insert("name2", PrimitiveValue::new_string("Fred")); - root_scope.insert("spaces", PrimitiveValue::new_string(" ")); - root_scope.insert("name", PrimitiveValue::new_string("Henry")); - root_scope.insert("company", PrimitiveValue::new_string("Acme")); - - let scopes = &[root_scope]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let value = eval_v1_expr(V1::Two, r#""~{None}""#, &mut types, scope).unwrap(); + let mut env = TestEnv::default(); + env.insert_name("str", PrimitiveValue::new_string("foo")); + env.insert_name("file", PrimitiveValue::new_file("bar")); + env.insert_name("dir", PrimitiveValue::new_directory("baz")); + env.insert_name("salutation", PrimitiveValue::new_string("hello")); + env.insert_name("name1", Value::None); + env.insert_name("name2", PrimitiveValue::new_string("Fred")); + env.insert_name("spaces", PrimitiveValue::new_string(" ")); + env.insert_name("name", PrimitiveValue::new_string("Henry")); + env.insert_name("company", PrimitiveValue::new_string("Acme")); + + let value = eval_v1_expr(&mut env, V1::Two, r#""~{None}""#).unwrap(); assert_eq!(value.unwrap_string().as_str(), ""); - let value = eval_v1_expr(V1::Two, r#""~{default="hi" None}""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, r#""~{default="hi" None}""#).unwrap(); assert_eq!(value.unwrap_string().as_str(), "hi"); - let value = eval_v1_expr(V1::Two, r#""~{true}""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, r#""~{true}""#).unwrap(); assert_eq!(value.unwrap_string().as_str(), "true"); - let value = eval_v1_expr(V1::Two, r#""~{false}""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, r#""~{false}""#).unwrap(); assert_eq!(value.unwrap_string().as_str(), "false"); - let value = eval_v1_expr( - V1::Two, - r#""~{true="yes" false="no" false}""#, - &mut types, - scope, - ) - .unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, r#""~{true="yes" false="no" false}""#).unwrap(); assert_eq!(value.unwrap_string().as_str(), "no"); - let value = eval_v1_expr(V1::Two, r#""~{12345}""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, r#""~{12345}""#).unwrap(); assert_eq!(value.unwrap_string().as_str(), "12345"); - let value = eval_v1_expr(V1::Two, r#""~{12345.6789}""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, r#""~{12345.6789}""#).unwrap(); assert_eq!(value.unwrap_string().as_str(), "12345.6789"); - let value = eval_v1_expr(V1::Two, r#""~{str}""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, r#""~{str}""#).unwrap(); assert_eq!(value.unwrap_string().as_str(), "foo"); - let value = eval_v1_expr(V1::Two, r#""~{file}""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, r#""~{file}""#).unwrap(); assert_eq!(value.unwrap_string().as_str(), "bar"); - let value = eval_v1_expr(V1::Two, r#""~{dir}""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, r#""~{dir}""#).unwrap(); assert_eq!(value.unwrap_string().as_str(), "baz"); - let value = eval_v1_expr( - V1::Two, - r#""~{sep="+" [1,2,3]} = ~{1 + 2 + 3}""#, - &mut types, - scope, - ) - .unwrap(); + let value = + eval_v1_expr(&mut env, V1::Two, r#""~{sep="+" [1,2,3]} = ~{1 + 2 + 3}""#).unwrap(); assert_eq!(value.unwrap_string().as_str(), "1+2+3 = 6"); let diagnostic = - eval_v1_expr(V1::Two, r#""~{[1, 2, 3]}""#, &mut types, scope).expect_err("should fail"); + eval_v1_expr(&mut env, V1::Two, r#""~{[1, 2, 3]}""#).expect_err("should fail"); assert_eq!( diagnostic.message(), "cannot coerce type `Array[Int]` to `String`" ); let value = eval_v1_expr( + &mut env, V1::Two, r#""~{salutation + ' ' + name1 + ', '}nice to meet you!""#, - &mut types, - scope, ) .unwrap(); assert_eq!(value.unwrap_string().as_str(), "nice to meet you!"); let value = eval_v1_expr( + &mut env, V1::Two, r#""${salutation + ' ' + name2 + ', '}nice to meet you!""#, - &mut types, - scope, ) .unwrap(); assert_eq!( @@ -1585,14 +1616,13 @@ pub(crate) mod test { ); let value = eval_v1_expr( + &mut env, V1::Two, r#" <<< ~{spaces}Hello ~{name}, ~{spaces}Welcome to ~{company}! >>>"#, - &mut types, - scope, ) .unwrap(); assert_eq!( @@ -1601,10 +1631,9 @@ pub(crate) mod test { ); let value = eval_v1_expr( + &mut env, V1::Two, r#""~{1 + 2 + 3 + 4 * 10 * 10} ~{"~{<<<~{'!' + '='}>>>}"} ~{10**3}""#, - &mut types, - scope, ) .unwrap(); assert_eq!(value.unwrap_string().as_str(), "406 != 1000"); @@ -1612,80 +1641,58 @@ pub(crate) mod test { #[test] fn literal_array_expr() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let value = eval_v1_expr(V1::Two, "[]", &mut types, scope).unwrap(); + let mut env = TestEnv::default(); + let value = eval_v1_expr(&mut env, V1::Two, "[]").unwrap(); assert_eq!(value.unwrap_array().to_string(), "[]"); - let value = eval_v1_expr(V1::Two, "[1, 2, 3]", &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, "[1, 2, 3]").unwrap(); assert_eq!(value.unwrap_array().to_string(), "[1, 2, 3]"); - let value = eval_v1_expr(V1::Two, "[[1], [2], [3.0]]", &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, "[[1], [2], [3.0]]").unwrap(); assert_eq!(value.unwrap_array().to_string(), "[[1.0], [2.0], [3.0]]"); - let value = eval_v1_expr(V1::Two, r#"["foo", "bar", "baz"]"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, r#"["foo", "bar", "baz"]"#).unwrap(); assert_eq!(value.unwrap_array().to_string(), r#"["foo", "bar", "baz"]"#); } #[test] fn literal_pair_expr() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let value = eval_v1_expr(V1::Two, "(true, false)", &mut types, scope).unwrap(); + let mut env = TestEnv::default(); + let value = eval_v1_expr(&mut env, V1::Two, "(true, false)").unwrap(); assert_eq!(value.unwrap_pair().to_string(), "(true, false)"); - let value = eval_v1_expr(V1::Two, "([1, 2, 3], [4, 5, 6])", &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, "([1, 2, 3], [4, 5, 6])").unwrap(); assert_eq!(value.unwrap_pair().to_string(), "([1, 2, 3], [4, 5, 6])"); - let value = eval_v1_expr(V1::Two, "([], {})", &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, "([], {})").unwrap(); assert_eq!(value.unwrap_pair().to_string(), "([], {})"); - let value = eval_v1_expr(V1::Two, r#"("foo", "bar")"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, r#"("foo", "bar")"#).unwrap(); assert_eq!(value.unwrap_pair().to_string(), r#"("foo", "bar")"#); } #[test] fn literal_map_expr() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let value = eval_v1_expr(V1::Two, "{}", &mut types, scope).unwrap(); + let mut env = TestEnv::default(); + let value = eval_v1_expr(&mut env, V1::Two, "{}").unwrap(); assert_eq!(value.unwrap_map().to_string(), "{}"); - let value = eval_v1_expr(V1::Two, "{ 1: 2, 3: 4, 5: 6 }", &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, "{ 1: 2, 3: 4, 5: 6 }").unwrap(); assert_eq!(value.unwrap_map().to_string(), "{1: 2, 3: 4, 5: 6}"); - let value = eval_v1_expr( - V1::Two, - r#"{"foo": "bar", "baz": "qux"}"#, - &mut types, - scope, - ) - .unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, r#"{"foo": "bar", "baz": "qux"}"#).unwrap(); assert_eq!( value.unwrap_map().to_string(), r#"{"foo": "bar", "baz": "qux"}"# ); - let value = eval_v1_expr( - V1::Two, - r#"{"foo": { 1: 2 }, "baz": {}}"#, - &mut types, - scope, - ) - .unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, r#"{"foo": { 1: 2 }, "baz": {}}"#).unwrap(); assert_eq!( value.unwrap_map().to_string(), r#"{"foo": {1: 2}, "baz": {}}"# ); - let value = - eval_v1_expr(V1::Two, r#"{"foo": 100, "baz": 2.5}"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, r#"{"foo": 100, "baz": 2.5}"#).unwrap(); assert_eq!( value.unwrap_map().to_string(), r#"{"foo": 100.0, "baz": 2.5}"# @@ -1694,42 +1701,26 @@ pub(crate) mod test { #[test] fn literal_object_expr() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let value = eval_v1_expr(V1::Two, "object {}", &mut types, scope).unwrap(); + let mut env = TestEnv::default(); + let value = eval_v1_expr(&mut env, V1::Two, "object {}").unwrap(); assert_eq!(value.unwrap_object().to_string(), "object {}"); - let value = eval_v1_expr( - V1::Two, - "object { foo: 2, bar: 4, baz: 6 }", - &mut types, - scope, - ) - .unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, "object { foo: 2, bar: 4, baz: 6 }").unwrap(); assert_eq!( value.unwrap_object().to_string(), "object {foo: 2, bar: 4, baz: 6}" ); - let value = eval_v1_expr( - V1::Two, - r#"object {foo: "bar", baz: "qux"}"#, - &mut types, - scope, - ) - .unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, r#"object {foo: "bar", baz: "qux"}"#).unwrap(); assert_eq!( value.unwrap_object().to_string(), r#"object {foo: "bar", baz: "qux"}"# ); let value = eval_v1_expr( + &mut env, V1::Two, r#"object {foo: { 1: 2 }, bar: [], qux: "jam"}"#, - &mut types, - scope, ) .unwrap(); assert_eq!( @@ -1738,10 +1729,9 @@ pub(crate) mod test { ); let value = eval_v1_expr( + &mut env, V1::Two, r#"object {foo: 1.0, bar: object { baz: "qux" }}"#, - &mut types, - scope, ) .unwrap(); assert_eq!( @@ -1752,16 +1742,13 @@ pub(crate) mod test { #[test] fn literal_struct_expr() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let bar_ty = types.add_struct(StructType::new("Bar", [ + let mut env = TestEnv::default(); + let bar_ty = env.types_mut().add_struct(StructType::new("Bar", [ ("foo", PrimitiveTypeKind::File), ("bar", PrimitiveTypeKind::Integer), ])); - let foo_ty = types.add_struct(StructType::new("Foo", [ + let foo_ty = env.types_mut().add_struct(StructType::new("Foo", [ ("foo", PrimitiveTypeKind::Float.into()), ( "bar", @@ -1769,14 +1756,13 @@ pub(crate) mod test { ), ])); - let mut context = - TestEvaluationContext::new(SupportedVersion::V1(V1::Two), &mut types, scope); - context.structs.insert("Foo", foo_ty); - context.structs.insert("Bar", bar_ty); + env.insert_struct("Foo", foo_ty); + env.insert_struct("Bar", bar_ty); - let value = eval_v1_expr_with_context( + let value = eval_v1_expr( + &mut env, + V1::Two, r#"Foo { foo: 1.0, bar: Bar { foo: "baz", bar: 2 }}"#, - &mut context, ) .unwrap(); assert_eq!( @@ -1784,346 +1770,263 @@ pub(crate) mod test { r#"Foo {foo: 1.0, bar: Bar {foo: "baz", bar: 2}}"# ); - let value = eval_v1_expr_with_context(r#"Foo { foo: 1, bar: Bar { foo: "baz", bar: 2 }} == Foo { foo: 1.0, bar: Bar { foo: "baz", bar: 2 }}"#, &mut context) + let value = eval_v1_expr(&mut env, V1::Two,r#"Foo { foo: 1, bar: Bar { foo: "baz", bar: 2 }} == Foo { foo: 1.0, bar: Bar { foo: "baz", bar: 2 }}"#) .unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr_with_context(r#"Foo { foo: 1, bar: Bar { foo: "baz", bar: 2 }} == Foo { foo: 1.0, bar: Bar { foo: "jam", bar: 2 }}"#, &mut context) + let value = eval_v1_expr(&mut env, V1::Two,r#"Foo { foo: 1, bar: Bar { foo: "baz", bar: 2 }} == Foo { foo: 1.0, bar: Bar { foo: "jam", bar: 2 }}"#) .unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr_with_context(r#"Foo { foo: 1, bar: Bar { foo: "baz", bar: 2 }} != Foo { foo: 1.0, bar: Bar { foo: "baz", bar: 2 }}"#, &mut context) + let value = eval_v1_expr(&mut env, V1::Two,r#"Foo { foo: 1, bar: Bar { foo: "baz", bar: 2 }} != Foo { foo: 1.0, bar: Bar { foo: "baz", bar: 2 }}"#) .unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr_with_context(r#"Foo { foo: 1, bar: Bar { foo: "baz", bar: 2 }} != Foo { foo: 1.0, bar: Bar { foo: "jam", bar: 2 }}"#, &mut context) + let value = eval_v1_expr(&mut env, V1::Two,r#"Foo { foo: 1, bar: Bar { foo: "baz", bar: 2 }} != Foo { foo: 1.0, bar: Bar { foo: "jam", bar: 2 }}"#) .unwrap(); assert!(value.unwrap_boolean()); } #[test] fn name_ref_expr() { - let mut root_scope = Scope::new(None); - root_scope.insert("foo", 1234); - let scopes = &[root_scope]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let value = eval_v1_expr(V1::Zero, r#"foo"#, &mut types, scope).unwrap(); + let mut env = TestEnv::default(); + env.insert_name("foo", 1234); + let value = eval_v1_expr(&mut env, V1::Zero, r#"foo"#).unwrap(); assert_eq!(value.unwrap_integer(), 1234); - let diagnostic = eval_v1_expr(V1::Zero, r#"bar"#, &mut types, scope).unwrap_err(); + let diagnostic = eval_v1_expr(&mut env, V1::Zero, r#"bar"#).unwrap_err(); assert_eq!(diagnostic.message(), "unknown name `bar`"); } #[test] fn parenthesized_expr() { - let mut root_scope = Scope::new(None); - root_scope.insert("foo", 1234); - let scopes = &[root_scope]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let value = - eval_v1_expr(V1::Zero, r#"(foo - foo) + (1234 - foo)"#, &mut types, scope).unwrap(); + let mut env = TestEnv::default(); + env.insert_name("foo", 1234); + let value = eval_v1_expr(&mut env, V1::Zero, r#"(foo - foo) + (1234 - foo)"#).unwrap(); assert_eq!(value.unwrap_integer(), 0); } #[test] fn if_expr() { - let mut root_scope = Scope::new(None); - root_scope.insert("foo", true); - root_scope.insert("bar", false); - root_scope.insert("baz", PrimitiveValue::new_file("file")); - - let scopes = &[root_scope]; - let scope = ScopeRef::new(scopes, 0); + let mut env = TestEnv::default(); + env.insert_name("foo", true); + env.insert_name("bar", false); + env.insert_name("baz", PrimitiveValue::new_file("file")); - let mut types = Types::default(); - let value = eval_v1_expr( - V1::Zero, - r#"if (foo) then "foo" else "bar""#, - &mut types, - scope, - ) - .unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"if (foo) then "foo" else "bar""#).unwrap(); assert_eq!(value.unwrap_string().as_str(), "foo"); - let value = eval_v1_expr( - V1::Zero, - r#"if (bar) then "foo" else "bar""#, - &mut types, - scope, - ) - .unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"if (bar) then "foo" else "bar""#).unwrap(); assert_eq!(value.unwrap_string().as_str(), "bar"); - let value = eval_v1_expr( - V1::Zero, - r#"if (foo) then 1234 else 0.5"#, - &mut types, - scope, - ) - .unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"if (foo) then 1234 else 0.5"#).unwrap(); approx::assert_relative_eq!(value.unwrap_float(), 1234.0); - let value = eval_v1_expr( - V1::Zero, - r#"if (bar) then 1234 else 0.5"#, - &mut types, - scope, - ) - .unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"if (bar) then 1234 else 0.5"#).unwrap(); approx::assert_relative_eq!(value.unwrap_float(), 0.5); - let value = eval_v1_expr( - V1::Zero, - r#"if (foo) then baz else "str""#, - &mut types, - scope, - ) - .unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"if (foo) then baz else "str""#).unwrap(); assert_eq!(value.unwrap_file().as_str(), "file"); - let value = eval_v1_expr( - V1::Zero, - r#"if (bar) then baz else "path""#, - &mut types, - scope, - ) - .unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"if (bar) then baz else "path""#).unwrap(); assert_eq!(value.unwrap_file().as_str(), "path"); } #[test] fn logical_not_expr() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let value = eval_v1_expr(V1::Zero, r#"!true"#, &mut types, scope).unwrap(); + let mut env = TestEnv::default(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"!true"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"!false"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"!false"#).unwrap(); assert!(value.unwrap_boolean()); } #[test] fn negation_expr() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let value = eval_v1_expr(V1::Zero, r#"-1234"#, &mut types, scope).unwrap(); + let mut env = TestEnv::default(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"-1234"#).unwrap(); assert_eq!(value.unwrap_integer(), -1234); - let value = eval_v1_expr(V1::Zero, r#"-(1234)"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"-(1234)"#).unwrap(); assert_eq!(value.unwrap_integer(), -1234); - let value = eval_v1_expr(V1::Zero, r#"----1234"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"----1234"#).unwrap(); assert_eq!(value.unwrap_integer(), 1234); - let value = eval_v1_expr(V1::Zero, r#"-1234.5678"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"-1234.5678"#).unwrap(); approx::assert_relative_eq!(value.unwrap_float(), -1234.5678); - let value = eval_v1_expr(V1::Zero, r#"-(1234.5678)"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"-(1234.5678)"#).unwrap(); approx::assert_relative_eq!(value.unwrap_float(), -1234.5678); - let value = eval_v1_expr(V1::Zero, r#"----1234.5678"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"----1234.5678"#).unwrap(); approx::assert_relative_eq!(value.unwrap_float(), 1234.5678); } #[test] fn logical_or_expr() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let value = eval_v1_expr(V1::Zero, r#"false || false"#, &mut types, scope).unwrap(); + let mut env = TestEnv::default(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"false || false"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"false || true"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"false || true"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"true || false"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"true || false"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"true || true"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"true || true"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"true || nope"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"true || nope"#).unwrap(); assert!(value.unwrap_boolean()); - let diagnostic = eval_v1_expr(V1::Zero, r#"false || nope"#, &mut types, scope).unwrap_err(); + let diagnostic = eval_v1_expr(&mut env, V1::Zero, r#"false || nope"#).unwrap_err(); assert_eq!(diagnostic.message(), "unknown name `nope`"); } #[test] fn logical_and_expr() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let value = eval_v1_expr(V1::Zero, r#"false && false"#, &mut types, scope).unwrap(); + let mut env = TestEnv::default(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"false && false"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"false && true"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"false && true"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"true && false"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"true && false"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"true && true"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"true && true"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"false && nope"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"false && nope"#).unwrap(); assert!(!value.unwrap_boolean()); - let diagnostic = eval_v1_expr(V1::Zero, r#"true && nope"#, &mut types, scope).unwrap_err(); + let diagnostic = eval_v1_expr(&mut env, V1::Zero, r#"true && nope"#).unwrap_err(); assert_eq!(diagnostic.message(), "unknown name `nope`"); } #[test] fn equality_expr() { - let mut root_scope = Scope::new(None); - root_scope.insert("foo", PrimitiveValue::new_file("foo")); - root_scope.insert("bar", PrimitiveValue::new_directory("bar")); - - let scopes = &[root_scope]; - let scope = ScopeRef::new(scopes, 0); + let mut env = TestEnv::default(); + env.insert_name("foo", PrimitiveValue::new_file("foo")); + env.insert_name("bar", PrimitiveValue::new_directory("bar")); - let mut types = Types::default(); - let value = eval_v1_expr(V1::Zero, r#"None == None"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"None == None"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"true == true"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"true == true"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1234 == 1234"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1234 == 1234"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1234 == 4321"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1234 == 4321"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1234 == 1234.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1234 == 1234.0"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"4321 == 1234.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"4321 == 1234.0"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1234.0 == 1234"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1234.0 == 1234"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1234.0 == 4321"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1234.0 == 4321"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1234.5678 == 1234.5678"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1234.5678 == 1234.5678"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1234.5678 == 8765.4321"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1234.5678 == 8765.4321"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#""foo" == "foo""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#""foo" == "foo""#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#""foo" == "bar""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#""foo" == "bar""#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#""foo" == foo"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#""foo" == foo"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#""foo" == bar"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#""foo" == bar"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"foo == "foo""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"foo == "foo""#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"foo == "bar""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"foo == "bar""#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"bar == "bar""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"bar == "bar""#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"bar == "foo""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"bar == "foo""#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr( - V1::Zero, - r#"(1234, "bar") == (1234, "bar")"#, - &mut types, - scope, - ) - .unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"(1234, "bar") == (1234, "bar")"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr( - V1::Zero, - r#"(1234, "bar") == (1234, "baz")"#, - &mut types, - scope, - ) - .unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"(1234, "bar") == (1234, "baz")"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"[1, 2, 3] == [1, 2, 3]"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"[1, 2, 3] == [1, 2, 3]"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"[1] == [2, 3]"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"[1] == [2, 3]"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"[1] == [2]"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"[1] == [2]"#).unwrap(); assert!(!value.unwrap_boolean()); let value = eval_v1_expr( + &mut env, V1::Zero, r#"{"foo": 1, "bar": 2, "baz": 3} == {"foo": 1, "bar": 2, "baz": 3}"#, - &mut types, - scope, ) .unwrap(); assert!(value.unwrap_boolean()); let value = eval_v1_expr( + &mut env, V1::Zero, r#"{"foo": 1, "bar": 2, "baz": 3} == {"foo": 1, "baz": 3}"#, - &mut types, - scope, ) .unwrap(); assert!(!value.unwrap_boolean()); let value = eval_v1_expr( + &mut env, V1::Zero, r#"{"foo": 1, "bar": 2, "baz": 3} == {"foo": 3, "bar": 2, "baz": 1}"#, - &mut types, - scope, ) .unwrap(); assert!(!value.unwrap_boolean()); let value = eval_v1_expr( + &mut env, V1::Zero, r#"object {foo: 1, bar: 2, baz: "3"} == object {foo: 1, bar: 2, baz: "3"}"#, - &mut types, - scope, ) .unwrap(); assert!(value.unwrap_boolean()); let value = eval_v1_expr( + &mut env, V1::Zero, r#"object {foo: 1, bar: 2, baz: "3"} == object {foo: 1, baz: "3"}"#, - &mut types, - scope, ) .unwrap(); assert!(!value.unwrap_boolean()); let value = eval_v1_expr( + &mut env, V1::Zero, r#"object {foo: 1, bar: 2, baz: "3"} == object {foo: 3, bar: 2, baz: "1"}"#, - &mut types, - scope, ) .unwrap(); assert!(!value.unwrap_boolean()); @@ -2133,145 +2036,123 @@ pub(crate) mod test { #[test] fn inequality_expr() { - let mut root_scope = Scope::new(None); - root_scope.insert("foo", PrimitiveValue::new_file("foo")); - root_scope.insert("bar", PrimitiveValue::new_directory("bar")); - - let scopes = &[root_scope]; - let scope = ScopeRef::new(scopes, 0); + let mut env = TestEnv::default(); + env.insert_name("foo", PrimitiveValue::new_file("foo")); + env.insert_name("bar", PrimitiveValue::new_directory("bar")); - let mut types = Types::default(); - let value = eval_v1_expr(V1::Zero, r#"None != None"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"None != None"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"true != true"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"true != true"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1234 != 1234"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1234 != 1234"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1234 != 4321"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1234 != 4321"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1234 != 1234.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1234 != 1234.0"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"4321 != 1234.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"4321 != 1234.0"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1234.0 != 1234"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1234.0 != 1234"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1234.0 != 4321"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1234.0 != 4321"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1234.5678 != 1234.5678"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1234.5678 != 1234.5678"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1234.5678 != 8765.4321"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1234.5678 != 8765.4321"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#""foo" != "foo""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#""foo" != "foo""#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#""foo" != "bar""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#""foo" != "bar""#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#""foo" != foo"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#""foo" != foo"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#""foo" != bar"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#""foo" != bar"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"foo != "foo""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"foo != "foo""#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"foo != "bar""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"foo != "bar""#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"bar != "bar""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"bar != "bar""#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"bar != "foo""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"bar != "foo""#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr( - V1::Zero, - r#"(1234, "bar") != (1234, "bar")"#, - &mut types, - scope, - ) - .unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"(1234, "bar") != (1234, "bar")"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr( - V1::Zero, - r#"(1234, "bar") != (1234, "baz")"#, - &mut types, - scope, - ) - .unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"(1234, "bar") != (1234, "baz")"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"[1, 2, 3] != [1, 2, 3]"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"[1, 2, 3] != [1, 2, 3]"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"[1] != [2, 3]"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"[1] != [2, 3]"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"[1] != [2]"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"[1] != [2]"#).unwrap(); assert!(value.unwrap_boolean()); let value = eval_v1_expr( + &mut env, V1::Zero, r#"{"foo": 1, "bar": 2, "baz": 3} != {"foo": 1, "bar": 2, "baz": 3}"#, - &mut types, - scope, ) .unwrap(); assert!(!value.unwrap_boolean()); let value = eval_v1_expr( + &mut env, V1::Zero, r#"{"foo": 1, "bar": 2, "baz": 3} != {"foo": 1, "baz": 3}"#, - &mut types, - scope, ) .unwrap(); assert!(value.unwrap_boolean()); let value = eval_v1_expr( + &mut env, V1::Zero, r#"{"foo": 1, "bar": 2, "baz": 3} != {"foo": 3, "bar": 2, "baz": 1}"#, - &mut types, - scope, ) .unwrap(); assert!(value.unwrap_boolean()); let value = eval_v1_expr( + &mut env, V1::Zero, r#"object {foo: 1, bar: 2, baz: "3"} != object {foo: 1, bar: 2, baz: "3"}"#, - &mut types, - scope, ) .unwrap(); assert!(!value.unwrap_boolean()); let value = eval_v1_expr( + &mut env, V1::Zero, r#"object {foo: 1, bar: 2, baz: "3"} != object {foo: 1, baz: "3"}"#, - &mut types, - scope, ) .unwrap(); assert!(value.unwrap_boolean()); let value = eval_v1_expr( + &mut env, V1::Zero, r#"object {foo: 1, bar: 2, baz: "3"} != object {foo: 3, bar: 2, baz: "1"}"#, - &mut types, - scope, ) .unwrap(); assert!(value.unwrap_boolean()); @@ -2281,416 +2162,371 @@ pub(crate) mod test { #[test] fn less_expr() { - let mut root_scope = Scope::new(None); - root_scope.insert("foo", PrimitiveValue::new_file("foo")); - root_scope.insert("bar", PrimitiveValue::new_directory("bar")); - - let scopes = &[root_scope]; - let scope = ScopeRef::new(scopes, 0); + let mut env = TestEnv::default(); + env.insert_name("foo", PrimitiveValue::new_file("foo")); + env.insert_name("bar", PrimitiveValue::new_directory("bar")); - let mut types = Types::default(); - let value = eval_v1_expr(V1::Zero, r#"false < true"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"false < true"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"true < false"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"true < false"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"true < true"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"true < true"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"0 < 1"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"0 < 1"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1 < 0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1 < 0"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1 < 1"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1 < 1"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"0 < 1.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"0 < 1.0"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1 < 0.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1 < 0.0"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1 < 1.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1 < 1.0"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"0.0 < 1"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"0.0 < 1"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1.0 < 0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1.0 < 0"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1.0 < 1"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1.0 < 1"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"0.0 < 1.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"0.0 < 1.0"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1.0 < 0.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1.0 < 0.0"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1.0 < 1.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1.0 < 1.0"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#""bar" < "foo""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#""bar" < "foo""#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#""foo" < "bar""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#""foo" < "bar""#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#""foo" < "foo""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#""foo" < "foo""#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"bar < "foo""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"bar < "foo""#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"bar < bar"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"bar < bar"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"foo < "bar""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"foo < "bar""#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"foo < foo"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"foo < foo"#).unwrap(); assert!(!value.unwrap_boolean()); } #[test] fn less_equal_expr() { - let mut root_scope = Scope::new(None); - root_scope.insert("foo", PrimitiveValue::new_file("foo")); - root_scope.insert("bar", PrimitiveValue::new_directory("bar")); + let mut env = TestEnv::default(); + env.insert_name("foo", PrimitiveValue::new_file("foo")); + env.insert_name("bar", PrimitiveValue::new_directory("bar")); - let scopes = &[root_scope]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let value = eval_v1_expr(V1::Zero, r#"false <= true"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"false <= true"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"true <= false"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"true <= false"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"true <= true"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"true <= true"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"0 <= 1"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"0 <= 1"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1 <= 0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1 <= 0"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1 <= 1"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1 <= 1"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"0 <= 1.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"0 <= 1.0"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1 <= 0.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1 <= 0.0"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1 <= 1.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1 <= 1.0"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"0.0 <= 1"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"0.0 <= 1"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1.0 <= 0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1.0 <= 0"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1.0 <= 1"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1.0 <= 1"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"0.0 <= 1.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"0.0 <= 1.0"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1.0 <= 0.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1.0 <= 0.0"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1.0 <= 1.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1.0 <= 1.0"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#""bar" <= "foo""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#""bar" <= "foo""#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#""foo" <= "bar""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#""foo" <= "bar""#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#""foo" <= "foo""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#""foo" <= "foo""#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"bar <= "foo""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"bar <= "foo""#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"bar <= bar"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"bar <= bar"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"foo <= "bar""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"foo <= "bar""#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"foo <= foo"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"foo <= foo"#).unwrap(); assert!(value.unwrap_boolean()); } #[test] fn greater_expr() { - let mut root_scope = Scope::new(None); - root_scope.insert("foo", PrimitiveValue::new_file("foo")); - root_scope.insert("bar", PrimitiveValue::new_directory("bar")); - - let scopes = &[root_scope]; - let scope = ScopeRef::new(scopes, 0); + let mut env = TestEnv::default(); + env.insert_name("foo", PrimitiveValue::new_file("foo")); + env.insert_name("bar", PrimitiveValue::new_directory("bar")); - let mut types = Types::default(); - let value = eval_v1_expr(V1::Zero, r#"false > true"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"false > true"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"true > false"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"true > false"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"true > true"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"true > true"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"0 > 1"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"0 > 1"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1 > 0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1 > 0"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1 > 1"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1 > 1"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"0 > 1.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"0 > 1.0"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1 > 0.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1 > 0.0"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1 > 1.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1 > 1.0"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"0.0 > 1"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"0.0 > 1"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1.0 > 0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1.0 > 0"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1.0 > 1"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1.0 > 1"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"0.0 > 1.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"0.0 > 1.0"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1.0 > 0.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1.0 > 0.0"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1.0 > 1.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1.0 > 1.0"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#""bar" > "foo""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#""bar" > "foo""#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#""foo" > "bar""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#""foo" > "bar""#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#""foo" > "foo""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#""foo" > "foo""#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"bar > "foo""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"bar > "foo""#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"bar > bar"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"bar > bar"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"foo > "bar""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"foo > "bar""#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"foo > foo"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"foo > foo"#).unwrap(); assert!(!value.unwrap_boolean()); } #[test] fn greater_equal_expr() { - let mut root_scope = Scope::new(None); - root_scope.insert("foo", PrimitiveValue::new_file("foo")); - root_scope.insert("bar", PrimitiveValue::new_directory("bar")); + let mut env = TestEnv::default(); + env.insert_name("foo", PrimitiveValue::new_file("foo")); + env.insert_name("bar", PrimitiveValue::new_directory("bar")); - let scopes = &[root_scope]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let value = eval_v1_expr(V1::Zero, r#"false >= true"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"false >= true"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"true >= false"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"true >= false"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"true >= true"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"true >= true"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"0 >= 1"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"0 >= 1"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1 >= 0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1 >= 0"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1 >= 1"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1 >= 1"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"0 >= 1.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"0 >= 1.0"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1 >= 0.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1 >= 0.0"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1 >= 1.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1 >= 1.0"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"0.0 >= 1"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"0.0 >= 1"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1.0 >= 0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1.0 >= 0"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1.0 >= 1"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1.0 >= 1"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"0.0 >= 1.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"0.0 >= 1.0"#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1.0 >= 0.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1.0 >= 0.0"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"1.0 >= 1.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1.0 >= 1.0"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#""bar" >= "foo""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#""bar" >= "foo""#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#""foo" >= "bar""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#""foo" >= "bar""#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#""foo" >= "foo""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#""foo" >= "foo""#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"bar >= "foo""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"bar >= "foo""#).unwrap(); assert!(!value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"bar >= bar"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"bar >= bar"#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"foo >= "bar""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"foo >= "bar""#).unwrap(); assert!(value.unwrap_boolean()); - let value = eval_v1_expr(V1::Zero, r#"foo >= foo"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"foo >= foo"#).unwrap(); assert!(value.unwrap_boolean()); } #[test] fn addition_expr() { - let mut root_scope = Scope::new(None); - root_scope.insert("foo", PrimitiveValue::new_file("foo")); - root_scope.insert("bar", PrimitiveValue::new_directory("bar")); - - let scopes = &[root_scope]; - let scope = ScopeRef::new(scopes, 0); + let mut env = TestEnv::default(); + env.insert_name("foo", PrimitiveValue::new_file("foo")); + env.insert_name("bar", PrimitiveValue::new_directory("bar")); - let mut types = Types::default(); - let value = eval_v1_expr(V1::Zero, r#"1 + 2 + 3 + 4"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1 + 2 + 3 + 4"#).unwrap(); assert_eq!(value.unwrap_integer(), 10); - let value = eval_v1_expr(V1::Zero, r#"10 + 20.0 + 30 + 40.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"10 + 20.0 + 30 + 40.0"#).unwrap(); approx::assert_relative_eq!(value.unwrap_float(), 100.0); - let value = - eval_v1_expr(V1::Zero, r#"100.0 + 200 + 300.0 + 400"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"100.0 + 200 + 300.0 + 400"#).unwrap(); approx::assert_relative_eq!(value.unwrap_float(), 1000.0); - let value = eval_v1_expr( - V1::Zero, - r#"1000.5 + 2000.5 + 3000.5 + 4000.5"#, - &mut types, - scope, - ) - .unwrap(); + let value = + eval_v1_expr(&mut env, V1::Zero, r#"1000.5 + 2000.5 + 3000.5 + 4000.5"#).unwrap(); approx::assert_relative_eq!(value.unwrap_float(), 10002.0); - let diagnostic = eval_v1_expr( - V1::Zero, - &format!(r#"{max} + 1"#, max = i64::MAX), - &mut types, - scope, - ) - .unwrap_err(); + let diagnostic = + eval_v1_expr(&mut env, V1::Zero, &format!(r#"{max} + 1"#, max = i64::MAX)).unwrap_err(); assert_eq!( diagnostic.message(), "evaluation of arithmetic expression resulted in overflow" ); - let value = eval_v1_expr(V1::Zero, r#""foo" + 1234"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#""foo" + 1234"#).unwrap(); assert_eq!(value.unwrap_string().as_str(), "foo1234"); - let value = eval_v1_expr(V1::Zero, r#"1234 + "foo""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1234 + "foo""#).unwrap(); assert_eq!(value.unwrap_string().as_str(), "1234foo"); - let value = eval_v1_expr(V1::Zero, r#""foo" + 1234.456"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#""foo" + 1234.456"#).unwrap(); assert_eq!(value.unwrap_string().as_str(), "foo1234.456"); - let value = eval_v1_expr(V1::Zero, r#"1234.456 + "foo""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1234.456 + "foo""#).unwrap(); assert_eq!(value.unwrap_string().as_str(), "1234.456foo"); - let value = eval_v1_expr(V1::Zero, r#""foo" + "bar""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#""foo" + "bar""#).unwrap(); assert_eq!(value.unwrap_string().as_str(), "foobar"); - let value = eval_v1_expr(V1::Zero, r#""bar" + "foo""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#""bar" + "foo""#).unwrap(); assert_eq!(value.unwrap_string().as_str(), "barfoo"); - let value = eval_v1_expr(V1::Zero, r#"foo + "bar""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"foo + "bar""#).unwrap(); assert_eq!(value.unwrap_string().as_str(), "foobar"); - let value = eval_v1_expr(V1::Zero, r#""bar" + foo"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#""bar" + foo"#).unwrap(); assert_eq!(value.unwrap_string().as_str(), "barfoo"); - let value = eval_v1_expr(V1::Zero, r#""foo" + bar"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#""foo" + bar"#).unwrap(); assert_eq!(value.unwrap_string().as_str(), "foobar"); - let value = eval_v1_expr(V1::Zero, r#"bar + "foo""#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"bar + "foo""#).unwrap(); assert_eq!(value.unwrap_string().as_str(), "barfoo"); } #[test] fn subtraction_expr() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let value = eval_v1_expr(V1::Zero, r#"-1 - 2 - 3 - 4"#, &mut types, scope).unwrap(); + let mut env = TestEnv::default(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"-1 - 2 - 3 - 4"#).unwrap(); assert_eq!(value.unwrap_integer(), -10); - let value = eval_v1_expr(V1::Zero, r#"-10 - 20.0 - 30 - 40.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"-10 - 20.0 - 30 - 40.0"#).unwrap(); approx::assert_relative_eq!(value.unwrap_float(), -100.0); - let value = - eval_v1_expr(V1::Zero, r#"-100.0 - 200 - 300.0 - 400"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"-100.0 - 200 - 300.0 - 400"#).unwrap(); approx::assert_relative_eq!(value.unwrap_float(), -1000.0); - let value = eval_v1_expr( - V1::Zero, - r#"-1000.5 - 2000.5 - 3000.5 - 4000.5"#, - &mut types, - scope, - ) - .unwrap(); + let value = + eval_v1_expr(&mut env, V1::Zero, r#"-1000.5 - 2000.5 - 3000.5 - 4000.5"#).unwrap(); approx::assert_relative_eq!(value.unwrap_float(), -10002.0); - let diagnostic = eval_v1_expr( - V1::Zero, - &format!(r#"{min} - 1"#, min = i64::MIN), - &mut types, - scope, - ) - .unwrap_err(); + let diagnostic = + eval_v1_expr(&mut env, V1::Zero, &format!(r#"{min} - 1"#, min = i64::MIN)).unwrap_err(); assert_eq!( diagnostic.message(), "evaluation of arithmetic expression resulted in overflow" @@ -2699,36 +2535,22 @@ pub(crate) mod test { #[test] fn multiplication_expr() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let value = eval_v1_expr(V1::Zero, r#"1 * 2 * 3 * 4"#, &mut types, scope).unwrap(); + let mut env = TestEnv::default(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"1 * 2 * 3 * 4"#).unwrap(); assert_eq!(value.unwrap_integer(), 24); - let value = eval_v1_expr(V1::Zero, r#"10 * 20.0 * 30 * 40.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"10 * 20.0 * 30 * 40.0"#).unwrap(); approx::assert_relative_eq!(value.unwrap_float(), 240000.0); - let value = - eval_v1_expr(V1::Zero, r#"100.0 * 200 * 300.0 * 400"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"100.0 * 200 * 300.0 * 400"#).unwrap(); approx::assert_relative_eq!(value.unwrap_float(), 2400000000.0); - let value = eval_v1_expr( - V1::Zero, - r#"1000.5 * 2000.5 * 3000.5 * 4000.5"#, - &mut types, - scope, - ) - .unwrap(); + let value = + eval_v1_expr(&mut env, V1::Zero, r#"1000.5 * 2000.5 * 3000.5 * 4000.5"#).unwrap(); approx::assert_relative_eq!(value.unwrap_float(), 24025008751250.063); - let diagnostic = eval_v1_expr( - V1::Zero, - &format!(r#"{max} * 2"#, max = i64::MAX), - &mut types, - scope, - ) - .unwrap_err(); + let diagnostic = + eval_v1_expr(&mut env, V1::Zero, &format!(r#"{max} * 2"#, max = i64::MAX)).unwrap_err(); assert_eq!( diagnostic.message(), "evaluation of arithmetic expression resulted in overflow" @@ -2737,37 +2559,27 @@ pub(crate) mod test { #[test] fn division_expr() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let value = eval_v1_expr(V1::Zero, r#"5 / 2"#, &mut types, scope).unwrap(); + let mut env = TestEnv::default(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"5 / 2"#).unwrap(); assert_eq!(value.unwrap_integer(), 2); - let value = eval_v1_expr(V1::Zero, r#"10 / 20.0 / 30 / 40.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"10 / 20.0 / 30 / 40.0"#).unwrap(); approx::assert_relative_eq!(value.unwrap_float(), 0.00041666666666666664); - let value = - eval_v1_expr(V1::Zero, r#"100.0 / 200 / 300.0 / 400"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"100.0 / 200 / 300.0 / 400"#).unwrap(); approx::assert_relative_eq!(value.unwrap_float(), 4.166666666666667e-6); - let value = eval_v1_expr( - V1::Zero, - r#"1000.5 / 2000.5 / 3000.5 / 4000.5"#, - &mut types, - scope, - ) - .unwrap(); + let value = + eval_v1_expr(&mut env, V1::Zero, r#"1000.5 / 2000.5 / 3000.5 / 4000.5"#).unwrap(); approx::assert_relative_eq!(value.unwrap_float(), 4.166492759125078e-8); - let diagnostic = eval_v1_expr(V1::Zero, r#"10 / 0"#, &mut types, scope).unwrap_err(); + let diagnostic = eval_v1_expr(&mut env, V1::Zero, r#"10 / 0"#).unwrap_err(); assert_eq!(diagnostic.message(), "attempt to divide by zero"); let diagnostic = eval_v1_expr( + &mut env, V1::Zero, &format!(r#"{min} / -1"#, min = i64::MIN), - &mut types, - scope, ) .unwrap_err(); assert_eq!( @@ -2778,30 +2590,26 @@ pub(crate) mod test { #[test] fn modulo_expr() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let value = eval_v1_expr(V1::Zero, r#"5 % 2"#, &mut types, scope).unwrap(); + let mut env = TestEnv::default(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"5 % 2"#).unwrap(); assert_eq!(value.unwrap_integer(), 1); - let value = eval_v1_expr(V1::Zero, r#"5.5 % 2"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"5.5 % 2"#).unwrap(); approx::assert_relative_eq!(value.unwrap_float(), 1.5); - let value = eval_v1_expr(V1::Zero, r#"5 % 2.5"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"5 % 2.5"#).unwrap(); approx::assert_relative_eq!(value.unwrap_float(), 0.0); - let value = eval_v1_expr(V1::Zero, r#"5.25 % 1.3"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"5.25 % 1.3"#).unwrap(); approx::assert_relative_eq!(value.unwrap_float(), 0.04999999999999982); - let diagnostic = eval_v1_expr(V1::Zero, r#"5 % 0"#, &mut types, scope).unwrap_err(); + let diagnostic = eval_v1_expr(&mut env, V1::Zero, r#"5 % 0"#).unwrap_err(); assert_eq!(diagnostic.message(), "attempt to divide by zero"); let diagnostic = eval_v1_expr( + &mut env, V1::Zero, &format!(r#"{min} % -1"#, min = i64::MIN), - &mut types, - scope, ) .unwrap_err(); assert_eq!( @@ -2812,35 +2620,27 @@ pub(crate) mod test { #[test] fn exponentiation_expr() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let diagnostic = eval_v1_expr(V1::Zero, r#"10 ** 0"#, &mut types, scope).unwrap_err(); + let mut env = TestEnv::default(); + let diagnostic = eval_v1_expr(&mut env, V1::Zero, r#"10 ** 0"#).unwrap_err(); assert_eq!( diagnostic.message(), "use of the exponentiation operator requires WDL version 1.2" ); - let value = eval_v1_expr(V1::Two, r#"5 ** 2 ** 2"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, r#"5 ** 2 ** 2"#).unwrap(); assert_eq!(value.unwrap_integer(), 625); - let value = eval_v1_expr(V1::Two, r#"5 ** 2.0 ** 2"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, r#"5 ** 2.0 ** 2"#).unwrap(); approx::assert_relative_eq!(value.unwrap_float(), 625.0); - let value = eval_v1_expr(V1::Two, r#"5 ** 2 ** 2.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, r#"5 ** 2 ** 2.0"#).unwrap(); approx::assert_relative_eq!(value.unwrap_float(), 625.0); - let value = eval_v1_expr(V1::Two, r#"5.0 ** 2.0 ** 2.0"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Two, r#"5.0 ** 2.0 ** 2.0"#).unwrap(); approx::assert_relative_eq!(value.unwrap_float(), 625.0); - let diagnostic = eval_v1_expr( - V1::Two, - &format!(r#"{max} ** 2"#, max = i64::MAX), - &mut types, - scope, - ) - .unwrap_err(); + let diagnostic = + eval_v1_expr(&mut env, V1::Two, &format!(r#"{max} ** 2"#, max = i64::MAX)).unwrap_err(); assert_eq!( diagnostic.message(), "evaluation of arithmetic expression resulted in overflow" @@ -2849,55 +2649,42 @@ pub(crate) mod test { #[test] fn call_expr() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - // This test will just check for errors; testing of the function implementations // is in `stdlib.rs` - let mut types = Types::default(); - let diagnostic = eval_v1_expr(V1::Zero, "min(1, 2)", &mut types, scope).unwrap_err(); + let mut env = TestEnv::default(); + let diagnostic = eval_v1_expr(&mut env, V1::Zero, "min(1, 2)").unwrap_err(); assert_eq!( diagnostic.message(), "this use of function `min` requires a minimum WDL version of 1.1" ); - let diagnostic = eval_v1_expr( - V1::Zero, - "min(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)", - &mut types, - scope, - ) - .unwrap_err(); + let diagnostic = + eval_v1_expr(&mut env, V1::Zero, "min(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)").unwrap_err(); assert_eq!( diagnostic.message(), "this use of function `min` requires a minimum WDL version of 1.1" ); - let diagnostic = eval_v1_expr(V1::One, "min(1)", &mut types, scope).unwrap_err(); + let diagnostic = eval_v1_expr(&mut env, V1::One, "min(1)").unwrap_err(); assert_eq!( diagnostic.message(), "function `min` requires at least 2 arguments but 1 was supplied" ); - let diagnostic = eval_v1_expr(V1::One, "min(1, 2, 3)", &mut types, scope).unwrap_err(); + let diagnostic = eval_v1_expr(&mut env, V1::One, "min(1, 2, 3)").unwrap_err(); assert_eq!( diagnostic.message(), "function `min` requires no more than 2 arguments but 3 were supplied" ); - let diagnostic = eval_v1_expr( - V1::One, - "min(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)", - &mut types, - scope, - ) - .unwrap_err(); + let diagnostic = + eval_v1_expr(&mut env, V1::One, "min(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)").unwrap_err(); assert_eq!( diagnostic.message(), "function `min` requires no more than 2 arguments but 10 were supplied" ); - let diagnostic = eval_v1_expr(V1::One, "min('1', 2)", &mut types, scope).unwrap_err(); + let diagnostic = eval_v1_expr(&mut env, V1::One, "min('1', 2)").unwrap_err(); assert_eq!( diagnostic.message(), "type mismatch: argument to function `min` expects type `Int` or `Float`, but found \ @@ -2907,69 +2694,66 @@ pub(crate) mod test { #[test] fn index_expr() { - let mut types = Types::default(); - let array_ty = types.add_array(ArrayType::new(PrimitiveTypeKind::Integer)); - let map_ty = types.add_map(MapType::new( + let mut env = TestEnv::default(); + let array_ty = env + .types_mut() + .add_array(ArrayType::new(PrimitiveTypeKind::Integer)); + let map_ty = env.types_mut().add_map(MapType::new( PrimitiveTypeKind::String, PrimitiveTypeKind::Integer, )); - let mut root_scope = Scope::new(None); - root_scope.insert( + env.insert_name( "foo", - Array::new(&types, array_ty, [1, 2, 3, 4, 5]).unwrap(), + Array::new(env.types(), array_ty, [1, 2, 3, 4, 5]).unwrap(), ); - root_scope.insert( + env.insert_name( "bar", - Map::new(&types, map_ty, [ + Map::new(env.types(), map_ty, [ (PrimitiveValue::new_string("foo"), 1), (PrimitiveValue::new_string("bar"), 2), ]) .unwrap(), ); - root_scope.insert("baz", PrimitiveValue::new_file("bar")); - - let scopes = &[root_scope]; - let scope = ScopeRef::new(scopes, 0); + env.insert_name("baz", PrimitiveValue::new_file("bar")); - let value = eval_v1_expr(V1::Zero, r#"foo[1]"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"foo[1]"#).unwrap(); assert_eq!(value.unwrap_integer(), 2); - let value = eval_v1_expr(V1::Zero, r#"foo[foo[[1, 2, 3][0]]]"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"foo[foo[[1, 2, 3][0]]]"#).unwrap(); assert_eq!(value.unwrap_integer(), 3); - let diagnostic = eval_v1_expr(V1::Zero, r#"foo[10]"#, &mut types, scope).unwrap_err(); + let diagnostic = eval_v1_expr(&mut env, V1::Zero, r#"foo[10]"#).unwrap_err(); assert_eq!(diagnostic.message(), "array index 10 is out of range"); - let diagnostic = eval_v1_expr(V1::Zero, r#"foo["10"]"#, &mut types, scope).unwrap_err(); + let diagnostic = eval_v1_expr(&mut env, V1::Zero, r#"foo["10"]"#).unwrap_err(); assert_eq!( diagnostic.message(), "type mismatch: expected index to be type `Int`, but found type `String`" ); - let value = eval_v1_expr(V1::Zero, r#"bar["foo"]"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"bar["foo"]"#).unwrap(); assert_eq!(value.unwrap_integer(), 1); - let value = eval_v1_expr(V1::Zero, r#"bar[baz]"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"bar[baz]"#).unwrap(); assert_eq!(value.unwrap_integer(), 2); - let value = eval_v1_expr(V1::Zero, r#"foo[bar["foo"]]"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"foo[bar["foo"]]"#).unwrap(); assert_eq!(value.unwrap_integer(), 2); - let diagnostic = - eval_v1_expr(V1::Zero, r#"bar["does not exist"]"#, &mut types, scope).unwrap_err(); + let diagnostic = eval_v1_expr(&mut env, V1::Zero, r#"bar["does not exist"]"#).unwrap_err(); assert_eq!( diagnostic.message(), "the map does not contain an entry for the specified key" ); - let diagnostic = eval_v1_expr(V1::Zero, r#"bar[1]"#, &mut types, scope).unwrap_err(); + let diagnostic = eval_v1_expr(&mut env, V1::Zero, r#"bar[1]"#).unwrap_err(); assert_eq!( diagnostic.message(), "type mismatch: expected index to be type `String`, but found type `Int`" ); - let diagnostic = eval_v1_expr(V1::Zero, r#"1[0]"#, &mut types, scope).unwrap_err(); + let diagnostic = eval_v1_expr(&mut env, V1::Zero, r#"1[0]"#).unwrap_err(); assert_eq!( diagnostic.message(), "indexing is only allowed on `Array` and `Map` types" @@ -2978,86 +2762,67 @@ pub(crate) mod test { #[test] fn access_expr() { - let mut types = Types::default(); - let pair_ty = types.add_pair(PairType::new( + let mut env = TestEnv::default(); + let pair_ty = env.types_mut().add_pair(PairType::new( PrimitiveTypeKind::Integer, PrimitiveTypeKind::String, )); - let struct_ty = types.add_struct(StructType::new("Foo", [ + let struct_ty = env.types_mut().add_struct(StructType::new("Foo", [ ("foo", PrimitiveTypeKind::Integer), ("bar", PrimitiveTypeKind::String), ])); - let mut root_scope = Scope::new(None); - root_scope.insert( + env.insert_name( "foo", - Pair::new(&types, pair_ty, 1, PrimitiveValue::new_string("foo")).unwrap(), + Pair::new(env.types(), pair_ty, 1, PrimitiveValue::new_string("foo")).unwrap(), ); - root_scope.insert( + env.insert_name( "bar", - Struct::new(&types, struct_ty, [ + Struct::new(env.types(), struct_ty, [ ("foo", 1.into()), ("bar", PrimitiveValue::new_string("bar")), ]) .unwrap(), ); - root_scope.insert("baz", 1); - - let scopes = &[root_scope]; - let scope = ScopeRef::new(scopes, 0); + env.insert_name("baz", 1); - let value = eval_v1_expr(V1::Zero, r#"foo.left"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"foo.left"#).unwrap(); assert_eq!(value.unwrap_integer(), 1); - let value = eval_v1_expr(V1::Zero, r#"foo.right"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"foo.right"#).unwrap(); assert_eq!(value.unwrap_string().as_str(), "foo"); - let diagnostic = eval_v1_expr(V1::Zero, r#"foo.bar"#, &mut types, scope).unwrap_err(); + let diagnostic = eval_v1_expr(&mut env, V1::Zero, r#"foo.bar"#).unwrap_err(); assert_eq!(diagnostic.message(), "cannot access a pair with name `bar`"); - let value = eval_v1_expr(V1::Zero, r#"bar.foo"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"bar.foo"#).unwrap(); assert_eq!(value.unwrap_integer(), 1); - let value = eval_v1_expr(V1::Zero, r#"bar.bar"#, &mut types, scope).unwrap(); + let value = eval_v1_expr(&mut env, V1::Zero, r#"bar.bar"#).unwrap(); assert_eq!(value.unwrap_string().as_str(), "bar"); - let diagnostic = eval_v1_expr(V1::Zero, r#"bar.baz"#, &mut types, scope).unwrap_err(); + let diagnostic = eval_v1_expr(&mut env, V1::Zero, r#"bar.baz"#).unwrap_err(); assert_eq!( diagnostic.message(), "struct `Foo` does not have a member named `baz`" ); - let value = eval_v1_expr( - V1::Zero, - r#"object { foo: 1, bar: "bar" }.foo"#, - &mut types, - scope, - ) - .unwrap(); + let value = + eval_v1_expr(&mut env, V1::Zero, r#"object { foo: 1, bar: "bar" }.foo"#).unwrap(); assert_eq!(value.unwrap_integer(), 1); - let value = eval_v1_expr( - V1::Zero, - r#"object { foo: 1, bar: "bar" }.bar"#, - &mut types, - scope, - ) - .unwrap(); + let value = + eval_v1_expr(&mut env, V1::Zero, r#"object { foo: 1, bar: "bar" }.bar"#).unwrap(); assert_eq!(value.unwrap_string().as_str(), "bar"); - let diagnostic = eval_v1_expr( - V1::Zero, - r#"object { foo: 1, bar: "bar" }.baz"#, - &mut types, - scope, - ) - .unwrap_err(); + let diagnostic = + eval_v1_expr(&mut env, V1::Zero, r#"object { foo: 1, bar: "bar" }.baz"#).unwrap_err(); assert_eq!( diagnostic.message(), "object does not have a member named `baz`" ); - let diagnostic = eval_v1_expr(V1::Zero, r#"baz.foo"#, &mut types, scope).unwrap_err(); + let diagnostic = eval_v1_expr(&mut env, V1::Zero, r#"baz.foo"#).unwrap_err(); assert_eq!(diagnostic.message(), "cannot access type `Int`"); } } diff --git a/wdl-engine/src/inputs.rs b/wdl-engine/src/inputs.rs index 891815d43..913c92500 100644 --- a/wdl-engine/src/inputs.rs +++ b/wdl-engine/src/inputs.rs @@ -701,7 +701,7 @@ impl InputsFile { ) -> Result { let mut inputs = TaskInputs::default(); for (key, value) in object { - let value = Value::from_json(types, value) + let value = Value::deserialize(types, value) .with_context(|| format!("invalid input key `{key}`"))?; match key.split_once(".") { @@ -734,7 +734,7 @@ impl InputsFile { ) -> Result { let mut inputs = WorkflowInputs::default(); for (key, value) in object { - let value = Value::from_json(types, value) + let value = Value::deserialize(types, value) .with_context(|| format!("invalid input key `{key}`"))?; match key.split_once(".") { diff --git a/wdl-engine/src/lib.rs b/wdl-engine/src/lib.rs index b047ed4e1..1e0d5e799 100644 --- a/wdl-engine/src/lib.rs +++ b/wdl-engine/src/lib.rs @@ -6,10 +6,12 @@ mod eval; mod inputs; mod outputs; mod stdlib; +mod units; mod value; pub use engine::*; pub use eval::*; pub use inputs::*; pub use outputs::*; +pub use units::*; pub use value::*; diff --git a/wdl-engine/src/stdlib.rs b/wdl-engine/src/stdlib.rs index adeb12c25..17077e536 100644 --- a/wdl-engine/src/stdlib.rs +++ b/wdl-engine/src/stdlib.rs @@ -1,13 +1,10 @@ //! Module for the WDL standard library implementation. -use std::borrow::Cow; use std::collections::HashMap; +use std::path::Path; use std::sync::LazyLock; -use regex::Regex; use wdl_analysis::stdlib::Binding; -use wdl_analysis::types::Optional; -use wdl_analysis::types::PrimitiveTypeKind; use wdl_analysis::types::Type; use wdl_analysis::types::TypeEq; use wdl_analysis::types::Types; @@ -15,267 +12,146 @@ use wdl_ast::Diagnostic; use wdl_ast::Span; use crate::Coercible; -use crate::PrimitiveValue; +use crate::EvaluationContext; use crate::Value; -use crate::diagnostics::invalid_regex; -/// Rounds a floating point number down to the next lower integer. -/// -/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#floor -pub fn floor( - types: &Types, - arguments: &[(Value, Span)], - return_type: Type, -) -> Result { - debug_assert_eq!(arguments.len(), 1); - debug_assert!(return_type.type_eq(types, &PrimitiveTypeKind::Integer.into())); - - let arg = arguments[0] - .0 - .coerce(types, PrimitiveTypeKind::Float.into()) - .expect("value should coerce to float") - .unwrap_float(); - Ok((arg.floor() as i64).into()) -} - -/// Rounds a floating point number up to the next higher integer. -/// -/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#ceil -pub fn ceil( - types: &Types, - arguments: &[(Value, Span)], - return_type: Type, -) -> Result { - debug_assert_eq!(arguments.len(), 1); - debug_assert!(return_type.type_eq(types, &PrimitiveTypeKind::Integer.into())); - - let arg = arguments[0] - .0 - .coerce(types, PrimitiveTypeKind::Float.into()) - .expect("value should coerce to float") - .unwrap_float(); - Ok((arg.ceil() as i64).into()) -} - -/// Rounds a floating point number to the nearest integer based on standard -/// rounding rules ("round half up"). -/// -/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#round -pub fn round( - types: &Types, - arguments: &[(Value, Span)], - return_type: Type, -) -> Result { - debug_assert_eq!(arguments.len(), 1); - debug_assert!(return_type.type_eq(types, &PrimitiveTypeKind::Integer.into())); - - let arg = arguments[0] - .0 - .coerce(types, PrimitiveTypeKind::Float.into()) - .expect("value should coerce to float") - .unwrap_float(); - Ok((arg.round() as i64).into()) +mod basename; +mod ceil; +mod find; +mod floor; +mod glob; +mod join_paths; +mod matches; +mod max; +mod min; +mod read_boolean; +mod read_float; +mod read_int; +mod read_json; +mod read_lines; +mod read_map; +mod read_object; +mod read_objects; +mod read_string; +mod read_tsv; +mod round; +mod size; +mod stderr; +mod stdout; +mod sub; +mod write_json; +mod write_lines; +mod write_map; +mod write_object; +mod write_objects; +mod write_tsv; + +/// Represents a function call argument. +pub struct CallArgument { + /// The value of the argument. + value: Value, + /// The span of the expression of the argument. + span: Span, } -/// Returns the smaller of two integer values. -/// -/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#min -pub fn int_min( - types: &Types, - arguments: &[(Value, Span)], - return_type: Type, -) -> Result { - debug_assert_eq!(arguments.len(), 2); - debug_assert!(return_type.type_eq(types, &PrimitiveTypeKind::Integer.into())); - - let first = arguments[0] - .0 - .coerce(types, PrimitiveTypeKind::Integer.into()) - .expect("value should coerce to integer") - .unwrap_integer(); - let second = arguments[1] - .0 - .coerce(types, PrimitiveTypeKind::Integer.into()) - .expect("value should coerce to integer") - .unwrap_integer(); - Ok(first.min(second).into()) -} - -/// Returns the smaller of two float values. -/// -/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#min -pub fn float_min( - types: &Types, - arguments: &[(Value, Span)], - return_type: Type, -) -> Result { - debug_assert_eq!(arguments.len(), 2); - debug_assert!(return_type.type_eq(types, &PrimitiveTypeKind::Float.into())); - - let first = arguments[0] - .0 - .coerce(types, PrimitiveTypeKind::Float.into()) - .expect("value should coerce to float") - .unwrap_float(); - let second = arguments[1] - .0 - .coerce(types, PrimitiveTypeKind::Float.into()) - .expect("value should coerce to float") - .unwrap_float(); - Ok(first.min(second).into()) -} - -/// Returns the larger of two integer values. -/// -/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#max -pub fn int_max( - types: &Types, - arguments: &[(Value, Span)], - return_type: Type, -) -> Result { - assert_eq!(arguments.len(), 2); - debug_assert!(return_type.type_eq(types, &PrimitiveTypeKind::Integer.into())); +impl CallArgument { + /// Constructs a new call argument given its value and span. + pub const fn new(value: Value, span: Span) -> Self { + Self { value, span } + } - let first = arguments[0] - .0 - .coerce(types, PrimitiveTypeKind::Integer.into()) - .expect("value should coerce to integer") - .unwrap_integer(); - let second = arguments[1] - .0 - .coerce(types, PrimitiveTypeKind::Integer.into()) - .expect("value should coerce to integer") - .unwrap_integer(); - Ok(first.max(second).into()) + /// Constructs a `None` call argument. + pub const fn none() -> Self { + Self { + value: Value::None, + span: Span::new(0, 0), + } + } } -/// Returns the larger of two float values. -/// -/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#max -pub fn float_max( - types: &Types, - arguments: &[(Value, Span)], +/// Represents function call context. +pub struct CallContext<'a> { + /// The evaluation context for the call. + context: &'a mut dyn EvaluationContext, + /// The call site span. + call_site: Span, + /// The arguments to the call. + arguments: &'a [CallArgument], + /// The return type. return_type: Type, -) -> Result { - assert_eq!(arguments.len(), 2); - debug_assert!(return_type.type_eq(types, &PrimitiveTypeKind::Float.into())); - - let first = arguments[0] - .0 - .coerce(types, PrimitiveTypeKind::Float.into()) - .expect("value should coerce to float") - .unwrap_float(); - let second = arguments[1] - .0 - .coerce(types, PrimitiveTypeKind::Float.into()) - .expect("value should coerce to float") - .unwrap_float(); - Ok(first.max(second).into()) } -/// Given two String parameters `input` and `pattern`, searches for the -/// occurrence of `pattern` within `input` and returns the first match or `None` -/// if there are no matches. -/// -/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#-find -pub fn find( - types: &Types, - arguments: &[(Value, Span)], - return_type: Type, -) -> Result { - assert_eq!(arguments.len(), 2); - debug_assert!(return_type.type_eq(types, &Type::from(PrimitiveTypeKind::String).optional())); - - let input = arguments[0] - .0 - .coerce(types, PrimitiveTypeKind::String.into()) - .expect("value should coerce to string") - .unwrap_string(); - let pattern = arguments[1] - .0 - .coerce(types, PrimitiveTypeKind::String.into()) - .expect("value should coerce to string") - .unwrap_string(); +impl<'a> CallContext<'a> { + /// Constructs a new call context given the call arguments. + pub fn new( + context: &'a mut dyn EvaluationContext, + call_site: Span, + arguments: &'a [CallArgument], + return_type: Type, + ) -> Self { + Self { + context, + call_site, + arguments, + return_type, + } + } - let regex = Regex::new(pattern.as_str()).map_err(|e| invalid_regex(&e, arguments[1].1))?; + /// Gets the types collection associated with the call. + pub fn types(&self) -> &Types { + self.context.types() + } - match regex.find(input.as_str()) { - Some(m) => Ok(PrimitiveValue::new_string(m.as_str()).into()), - None => Ok(Value::None), + /// Gets the mutable types collection associated with the call. + pub fn types_mut(&mut self) -> &mut Types { + self.context.types_mut() } -} -/// Given two String parameters `input` and `pattern`, tests whether `pattern` -/// matches `input` at least once. -/// -/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#-matches -pub fn matches( - types: &Types, - arguments: &[(Value, Span)], - return_type: Type, -) -> Result { - assert_eq!(arguments.len(), 2); - debug_assert!(return_type.type_eq(types, &PrimitiveTypeKind::Boolean.into())); + /// Gets the current working directory for the call. + pub fn cwd(&self) -> &Path { + self.context.cwd() + } - let input = arguments[0] - .0 - .coerce(types, PrimitiveTypeKind::String.into()) - .expect("value should coerce to string") - .unwrap_string(); - let pattern = arguments[1] - .0 - .coerce(types, PrimitiveTypeKind::String.into()) - .expect("value should coerce to string") - .unwrap_string(); + /// Gets the temp directory for the call. + pub fn tmp(&self) -> &Path { + self.context.tmp() + } - let regex = Regex::new(pattern.as_str()).map_err(|e| invalid_regex(&e, arguments[1].1))?; - Ok(regex.is_match(input.as_str()).into()) -} + /// Gets the stdout value for the call. + pub fn stdout(&self) -> Option { + self.context.stdout() + } -/// Given three String parameters `input`, `pattern`, and `replace`, this -/// function replaces all non-overlapping occurrences of `pattern` in `input` -/// with `replace`. -/// -/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#sub -pub fn sub( - types: &Types, - arguments: &[(Value, Span)], - return_type: Type, -) -> Result { - assert_eq!(arguments.len(), 3); - debug_assert!(return_type.type_eq(types, &PrimitiveTypeKind::String.into())); + /// Gets the stderr value for the call. + pub fn stderr(&self) -> Option { + self.context.stderr() + } - let input = arguments[0] - .0 - .coerce(types, PrimitiveTypeKind::String.into()) - .expect("value should coerce to string") - .unwrap_string(); - let pattern = arguments[1] - .0 - .coerce(types, PrimitiveTypeKind::String.into()) - .expect("value should coerce to string") - .unwrap_string(); - let replacement = arguments[2] - .0 - .coerce(types, PrimitiveTypeKind::String.into()) - .expect("value should coerce to string") - .unwrap_string(); + /// Coerces an argument to the given type. + /// + /// # Panics + /// + /// Panics if the given index is out of range or if the value fails to + /// coerce to the given type. + #[inline] + fn coerce_argument(&self, index: usize, ty: impl Into) -> Value { + self.arguments[index] + .value + .coerce(self.context.types(), ty.into()) + .expect("value should coerce") + } - let regex = Regex::new(pattern.as_str()).map_err(|e| invalid_regex(&e, arguments[1].1))?; - match regex.replace(input.as_str(), replacement.as_str()) { - Cow::Borrowed(_) => { - // No replacements, just return the input - Ok(PrimitiveValue::String(input).into()) - } - Cow::Owned(s) => { - // A replacement occurred, allocate a new string - Ok(PrimitiveValue::new_string(s).into()) - } + /// Checks to see if the calculated return type equals the given type. + /// + /// This is only used in assertions made by the function implementations. + #[cfg(debug_assertions)] + fn return_type_eq(&self, ty: impl Into) -> bool { + self.return_type.type_eq(self.context.types(), &ty.into()) } } /// Represents a WDL function implementation callback. -type Callback = fn(&Types, &[(Value, Span)], Type) -> Result; +type Callback = fn(context: CallContext<'_>) -> Result; /// Represents an implementation signature for a WDL standard library function. #[derive(Debug, Clone, Copy)] @@ -309,15 +185,14 @@ impl Function { Self { signatures } } - /// Calls the function given the binding and the function's arguments. + /// Calls the function given the binding and call context. #[inline] pub fn call( &self, binding: Binding<'_>, - types: &Types, - arguments: &[(Value, Span)], + context: CallContext<'_>, ) -> Result { - (self.signatures[binding.index()].callback)(types, arguments, binding.return_type()) + (self.signatures[binding.index()].callback)(context) } } @@ -341,123 +216,74 @@ impl StandardLibrary { /// Represents the mapping between function name and overload index to the /// implementation callback. pub static STDLIB: LazyLock = LazyLock::new(|| { - let mut functions = HashMap::with_capacity(wdl_analysis::stdlib::STDLIB.functions().len()); - assert!( - functions - .insert( - "floor", - Function::new(const { &[Signature::new("(Float) -> Int", floor)] }) - ) - .is_none() - ); - assert!( - functions - .insert( - "ceil", - Function::new(const { &[Signature::new("(Float) -> Int", ceil)] }) - ) - .is_none() - ); - assert!( - functions - .insert( - "round", - Function::new(const { &[Signature::new("(Float) -> Int", round)] }) - ) - .is_none() - ); - assert!( - functions - .insert( - "min", - Function::new( - const { - &[ - Signature::new("(Int, Int) -> Int", int_min), - Signature::new("(Int, Float) -> Float", float_min), - Signature::new("(Float, Int) -> Float", float_min), - Signature::new("(Float, Float) -> Float", float_min), - ] - } - ) - ) - .is_none() - ); - assert!( - functions - .insert( - "max", - Function::new( - const { - &[ - Signature::new("(Int, Int) -> Int", int_max), - Signature::new("(Int, Float) -> Float", float_max), - Signature::new("(Float, Int) -> Float", float_max), - Signature::new("(Float, Float) -> Float", float_max), - ] - } - ) - ) - .is_none() - ); - assert!( - functions - .insert( - "find", - Function::new(const { &[Signature::new("(String, String) -> String?", find)] }) - ) - .is_none() - ); - assert!( - functions - .insert( - "matches", - Function::new(const { &[Signature::new("(String, String) -> Boolean", matches)] }) - ) - .is_none() - ); - assert!( - functions - .insert( - "sub", - Function::new( - const { &[Signature::new("(String, String, String) -> String", sub,)] } - ) - ) - .is_none() - ); + /// Helper macro for mapping a function name to its descriptor + macro_rules! func { + ($name:ident) => { + (stringify!($name), $name::descriptor()) + }; + } - StandardLibrary { functions } + StandardLibrary { + functions: HashMap::from_iter([ + func!(floor), + func!(ceil), + func!(round), + func!(min), + func!(max), + func!(find), + func!(matches), + func!(sub), + func!(basename), + func!(join_paths), + func!(glob), + func!(size), + func!(stdout), + func!(stderr), + func!(read_string), + func!(read_int), + func!(read_float), + func!(read_boolean), + func!(read_lines), + func!(write_lines), + func!(read_tsv), + func!(write_tsv), + func!(read_map), + func!(write_map), + func!(read_json), + func!(write_json), + func!(read_object), + func!(read_objects), + func!(write_object), + func!(write_objects), + ]), + } }); #[cfg(test)] mod test { use pretty_assertions::assert_eq; + use wdl_analysis::stdlib::STDLIB as ANALYSIS_STDLIB; use wdl_analysis::stdlib::TypeParameters; - use wdl_ast::version::V1; use super::*; - use crate::Scope; - use crate::ScopeRef; - use crate::v1::test::eval_v1_expr; /// A test to verify that the STDLIB function types from `wdl-analysis` /// aligns with the STDLIB implementation from `wdl-engine`. #[test] fn verify_stdlib() { - for (name, func) in wdl_analysis::stdlib::STDLIB.functions() { + for (name, func) in ANALYSIS_STDLIB.functions() { match STDLIB.functions.get(name) { Some(imp) => match func { wdl_analysis::stdlib::Function::Monomorphic(f) => { assert_eq!( imp.signatures.len(), 1, - "signature mismatch for function `{name}`" + "signature count mismatch for function `{name}`" ); assert_eq!( f.signature() .display( - wdl_analysis::stdlib::STDLIB.types(), + ANALYSIS_STDLIB.types(), &TypeParameters::new(f.signature().type_parameters()) ) .to_string(), @@ -466,11 +292,15 @@ mod test { ); } wdl_analysis::stdlib::Function::Polymorphic(f) => { - assert_eq!(imp.signatures.len(), f.signatures().len()); + assert_eq!( + imp.signatures.len(), + f.signatures().len(), + "signature count mismatch for function `{name}`" + ); for (i, sig) in f.signatures().iter().enumerate() { assert_eq!( sig.display( - wdl_analysis::stdlib::STDLIB.types(), + ANALYSIS_STDLIB.types(), &TypeParameters::new(sig.type_parameters()) ) .to_string(), @@ -487,328 +317,4 @@ mod test { } } } - - #[test] - fn floor() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let value = eval_v1_expr(V1::Zero, "floor(10.5)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), 10); - - let value = eval_v1_expr(V1::Zero, "floor(10)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), 10); - - let value = eval_v1_expr(V1::Zero, "floor(9.9999)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), 9); - - let value = eval_v1_expr(V1::Zero, "floor(0)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), 0); - - let value = eval_v1_expr(V1::Zero, "floor(-5.1)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), -6); - } - - #[test] - fn ceil() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let value = eval_v1_expr(V1::Zero, "ceil(10.5)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), 11); - - let value = eval_v1_expr(V1::Zero, "ceil(10)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), 10); - - let value = eval_v1_expr(V1::Zero, "ceil(9.9999)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), 10); - - let value = eval_v1_expr(V1::Zero, "ceil(0)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), 0); - - let value = eval_v1_expr(V1::Zero, "ceil(-5.1)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), -5); - } - - #[test] - fn round() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let value = eval_v1_expr(V1::Zero, "round(10.5)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), 11); - - let value = eval_v1_expr(V1::Zero, "round(10.3)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), 10); - - let value = eval_v1_expr(V1::Zero, "round(10)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), 10); - - let value = eval_v1_expr(V1::Zero, "round(9.9999)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), 10); - - let value = eval_v1_expr(V1::Zero, "round(9.12345)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), 9); - - let value = eval_v1_expr(V1::Zero, "round(0)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), 0); - - let value = eval_v1_expr(V1::Zero, "round(-5.1)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), -5); - - let value = eval_v1_expr(V1::Zero, "round(-5.5)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), -6); - } - - #[test] - fn min() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let value = eval_v1_expr(V1::One, "min(7, 42)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), 7); - - let value = eval_v1_expr(V1::One, "min(42, 7)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), 7); - - let value = eval_v1_expr(V1::One, "min(-42, 7)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), -42); - - let value = eval_v1_expr(V1::One, "min(0, -42)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), -42); - - let value = eval_v1_expr(V1::One, "min(0, 42)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), 0); - - let value = eval_v1_expr(V1::One, "min(7.0, 42)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), 7.0); - - let value = eval_v1_expr(V1::One, "min(42.0, 7)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), 7.0); - - let value = eval_v1_expr(V1::One, "min(-42.0, 7)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), -42.0); - - let value = eval_v1_expr(V1::One, "min(0.0, -42)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), -42.0); - - let value = eval_v1_expr(V1::One, "min(0.0, 42)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), -0.0); - - let value = eval_v1_expr(V1::One, "min(7, 42.0)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), 7.0); - - let value = eval_v1_expr(V1::One, "min(42, 7.0)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), 7.0); - - let value = eval_v1_expr(V1::One, "min(-42, 7.0)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), -42.0); - - let value = eval_v1_expr(V1::One, "min(0, -42.0)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), -42.0); - - let value = eval_v1_expr(V1::One, "min(0, 42.0)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), -0.0); - - let value = eval_v1_expr(V1::One, "min(7.0, 42.0)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), 7.0); - - let value = eval_v1_expr(V1::One, "min(42.0, 7.0)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), 7.0); - - let value = eval_v1_expr(V1::One, "min(-42.0, 7.0)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), -42.0); - - let value = eval_v1_expr(V1::One, "min(0.0, -42.0)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), -42.0); - - let value = eval_v1_expr(V1::One, "min(0.0, 42.0)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), -0.0); - - let value = eval_v1_expr( - V1::One, - "min(12345, min(-100, min(54321, 1234.5678)))", - &mut types, - scope, - ) - .unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), -100.0); - } - - #[test] - fn max() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let value = eval_v1_expr(V1::One, "max(7, 42)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), 42); - - let value = eval_v1_expr(V1::One, "max(42, 7)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), 42); - - let value = eval_v1_expr(V1::One, "max(-42, 7)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), 7); - - let value = eval_v1_expr(V1::One, "max(0, -42)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), 0); - - let value = eval_v1_expr(V1::One, "max(0, 42)", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_integer(), 42); - - let value = eval_v1_expr(V1::One, "max(7.0, 42)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), 42.0); - - let value = eval_v1_expr(V1::One, "max(42.0, 7)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), 42.0); - - let value = eval_v1_expr(V1::One, "max(-42.0, 7)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), 7.0); - - let value = eval_v1_expr(V1::One, "max(0.0, -42)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), 0.0); - - let value = eval_v1_expr(V1::One, "max(0.0, 42)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), 42.0); - - let value = eval_v1_expr(V1::One, "max(7, 42.0)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), 42.0); - - let value = eval_v1_expr(V1::One, "max(42, 7.0)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), 42.0); - - let value = eval_v1_expr(V1::One, "max(-42, 7.0)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), 7.0); - - let value = eval_v1_expr(V1::One, "max(0, -42.0)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), 0.0); - - let value = eval_v1_expr(V1::One, "max(0, 42.0)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), 42.0); - - let value = eval_v1_expr(V1::One, "max(7.0, 42.0)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), 42.0); - - let value = eval_v1_expr(V1::One, "max(42.0, 7.0)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), 42.0); - - let value = eval_v1_expr(V1::One, "max(-42.0, 7.0)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), 7.0); - - let value = eval_v1_expr(V1::One, "max(0.0, -42.0)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), 0.0); - - let value = eval_v1_expr(V1::One, "max(0.0, 42.0)", &mut types, scope).unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), 42.0); - - let value = eval_v1_expr( - V1::One, - "max(12345, max(-100, max(54321, 1234.5678)))", - &mut types, - scope, - ) - .unwrap(); - approx::assert_relative_eq!(value.unwrap_float(), 54321.0); - } - - #[test] - fn find() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let diagnostic = - eval_v1_expr(V1::Two, "find('foo bar baz', '?')", &mut types, scope).unwrap_err(); - assert_eq!( - diagnostic.message(), - "regex parse error:\n ?\n ^\nerror: repetition operator missing expression" - ); - - let value = - eval_v1_expr(V1::Two, "find('hello world', 'e..o')", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_string().as_str(), "ello"); - - let value = - eval_v1_expr(V1::Two, "find('hello world', 'goodbye')", &mut types, scope).unwrap(); - assert!(value.is_none()); - - let value = eval_v1_expr(V1::Two, "find('hello\tBob', '\\t')", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_string().as_str(), "\t"); - } - - #[test] - fn matches() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let diagnostic = - eval_v1_expr(V1::Two, "matches('foo bar baz', '?')", &mut types, scope).unwrap_err(); - assert_eq!( - diagnostic.message(), - "regex parse error:\n ?\n ^\nerror: repetition operator missing expression" - ); - - let value = - eval_v1_expr(V1::Two, "matches('hello world', 'e..o')", &mut types, scope).unwrap(); - assert!(value.unwrap_boolean()); - - let value = eval_v1_expr( - V1::Two, - "matches('hello world', 'goodbye')", - &mut types, - scope, - ) - .unwrap(); - assert!(!value.unwrap_boolean()); - - let value = - eval_v1_expr(V1::Two, "matches('hello\tBob', '\\t')", &mut types, scope).unwrap(); - assert!(value.unwrap_boolean()); - } - - #[test] - fn sub() { - let scopes = &[Scope::new(None)]; - let scope = ScopeRef::new(scopes, 0); - - let mut types = Types::default(); - let diagnostic = eval_v1_expr( - V1::Two, - "sub('foo bar baz', '?', 'nope')", - &mut types, - scope, - ) - .unwrap_err(); - assert_eq!( - diagnostic.message(), - "regex parse error:\n ?\n ^\nerror: repetition operator missing expression" - ); - - let value = eval_v1_expr( - V1::Two, - "sub('hello world', 'e..o', 'ey there')", - &mut types, - scope, - ) - .unwrap(); - assert_eq!(value.unwrap_string().as_str(), "hey there world"); - - let value = eval_v1_expr( - V1::Two, - "sub('hello world', 'goodbye', 'nope')", - &mut types, - scope, - ) - .unwrap(); - assert_eq!(value.unwrap_string().as_str(), "hello world"); - - let value = - eval_v1_expr(V1::Two, "sub('hello\tBob', '\\t', ' ')", &mut types, scope).unwrap(); - assert_eq!(value.unwrap_string().as_str(), "hello Bob"); - } } diff --git a/wdl-engine/src/stdlib/basename.rs b/wdl-engine/src/stdlib/basename.rs new file mode 100644 index 000000000..510c237a0 --- /dev/null +++ b/wdl-engine/src/stdlib/basename.rs @@ -0,0 +1,91 @@ +//! Implements the `baseline` function from the WDL standard library. + +use std::path::Path; + +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_ast::Diagnostic; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::PrimitiveValue; +use crate::Value; + +/// Returns the "basename" of a file or directory - the name after the last +/// directory separator in the path. +/// +/// The optional second parameter specifies a literal suffix to remove from the +/// file name. If the file name does not end with the specified suffix then it +/// is ignored. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#basename +fn basename(context: CallContext<'_>) -> Result { + debug_assert!(!context.arguments.is_empty() && context.arguments.len() < 3); + debug_assert!(context.return_type_eq(PrimitiveTypeKind::String)); + + let path = context + .coerce_argument(0, PrimitiveTypeKind::String) + .unwrap_string(); + + match Path::new(path.as_str()).file_name() { + Some(base) => { + let base = base.to_str().expect("should be UTF-8"); + let base = if context.arguments.len() == 2 { + base.strip_suffix( + context + .coerce_argument(1, PrimitiveTypeKind::String) + .unwrap_string() + .as_str(), + ) + .unwrap_or(base) + } else { + base + }; + + Ok(PrimitiveValue::new_string(base).into()) + } + None => Ok(PrimitiveValue::String(path).into()), + } +} + +/// Gets the function describing `basename`. +pub const fn descriptor() -> Function { + Function::new( + const { + &[ + Signature::new("(File, ) -> String", basename), + Signature::new("(String, ) -> String", basename), + Signature::new("(Directory, ) -> String", basename), + ] + }, + ) +} + +#[cfg(test)] +mod test { + use pretty_assertions::assert_eq; + use wdl_ast::version::V1; + + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + #[test] + fn basename() { + let mut env = TestEnv::default(); + let value = eval_v1_expr(&mut env, V1::Two, "basename('/path/to/file.txt')").unwrap(); + assert_eq!(value.unwrap_string().as_str(), "file.txt"); + + let value = + eval_v1_expr(&mut env, V1::Two, "basename('/path/to/file.txt', '.txt')").unwrap(); + assert_eq!(value.unwrap_string().as_str(), "file"); + + let value = eval_v1_expr(&mut env, V1::Two, "basename('/path/to/dir')").unwrap(); + assert_eq!(value.unwrap_string().as_str(), "dir"); + + let value = eval_v1_expr(&mut env, V1::Two, "basename('file.txt')").unwrap(); + assert_eq!(value.unwrap_string().as_str(), "file.txt"); + + let value = eval_v1_expr(&mut env, V1::Two, "basename('file.txt', '.txt')").unwrap(); + assert_eq!(value.unwrap_string().as_str(), "file"); + } +} diff --git a/wdl-engine/src/stdlib/ceil.rs b/wdl-engine/src/stdlib/ceil.rs new file mode 100644 index 000000000..bf80ed0db --- /dev/null +++ b/wdl-engine/src/stdlib/ceil.rs @@ -0,0 +1,55 @@ +//! Implements the `ceil` function from the WDL standard library. + +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_ast::Diagnostic; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::Value; + +/// Rounds a floating point number up to the next higher integer. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#ceil +fn ceil(context: CallContext<'_>) -> Result { + debug_assert_eq!(context.arguments.len(), 1); + debug_assert!(context.return_type_eq(PrimitiveTypeKind::Integer)); + + let arg = context + .coerce_argument(0, PrimitiveTypeKind::Float) + .unwrap_float(); + Ok((arg.ceil() as i64).into()) +} + +/// Gets the function describing `ceil`. +pub const fn descriptor() -> Function { + Function::new(const { &[Signature::new("(Float) -> Int", ceil)] }) +} + +#[cfg(test)] +mod test { + use pretty_assertions::assert_eq; + use wdl_ast::version::V1; + + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + #[test] + fn ceil() { + let mut env = TestEnv::default(); + let value = eval_v1_expr(&mut env, V1::Zero, "ceil(10.5)").unwrap(); + assert_eq!(value.unwrap_integer(), 11); + + let value = eval_v1_expr(&mut env, V1::Zero, "ceil(10)").unwrap(); + assert_eq!(value.unwrap_integer(), 10); + + let value = eval_v1_expr(&mut env, V1::Zero, "ceil(9.9999)").unwrap(); + assert_eq!(value.unwrap_integer(), 10); + + let value = eval_v1_expr(&mut env, V1::Zero, "ceil(0)").unwrap(); + assert_eq!(value.unwrap_integer(), 0); + + let value = eval_v1_expr(&mut env, V1::Zero, "ceil(-5.1)").unwrap(); + assert_eq!(value.unwrap_integer(), -5); + } +} diff --git a/wdl-engine/src/stdlib/find.rs b/wdl-engine/src/stdlib/find.rs new file mode 100644 index 000000000..9b6e31165 --- /dev/null +++ b/wdl-engine/src/stdlib/find.rs @@ -0,0 +1,72 @@ +//! Implements the `find` function from the WDL standard library. + +use regex::Regex; +use wdl_analysis::types::Optional; +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_analysis::types::Type; +use wdl_ast::Diagnostic; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::PrimitiveValue; +use crate::Value; +use crate::diagnostics::invalid_regex; + +/// Given two String parameters `input` and `pattern`, searches for the +/// occurrence of `pattern` within `input` and returns the first match or `None` +/// if there are no matches. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#-find +fn find(context: CallContext<'_>) -> Result { + debug_assert_eq!(context.arguments.len(), 2); + debug_assert!(context.return_type_eq(Type::from(PrimitiveTypeKind::String).optional())); + + let input = context + .coerce_argument(0, PrimitiveTypeKind::String) + .unwrap_string(); + let pattern = context + .coerce_argument(1, PrimitiveTypeKind::String) + .unwrap_string(); + + let regex = + Regex::new(pattern.as_str()).map_err(|e| invalid_regex(&e, context.arguments[1].span))?; + + match regex.find(input.as_str()) { + Some(m) => Ok(PrimitiveValue::new_string(m.as_str()).into()), + None => Ok(Value::None), + } +} + +/// Gets the function describing `find`. +pub const fn descriptor() -> Function { + Function::new(const { &[Signature::new("(String, String) -> String?", find)] }) +} + +#[cfg(test)] +mod test { + use pretty_assertions::assert_eq; + use wdl_ast::version::V1; + + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + #[test] + fn find() { + let mut env = TestEnv::default(); + let diagnostic = eval_v1_expr(&mut env, V1::Two, "find('foo bar baz', '?')").unwrap_err(); + assert_eq!( + diagnostic.message(), + "regex parse error:\n ?\n ^\nerror: repetition operator missing expression" + ); + + let value = eval_v1_expr(&mut env, V1::Two, "find('hello world', 'e..o')").unwrap(); + assert_eq!(value.unwrap_string().as_str(), "ello"); + + let value = eval_v1_expr(&mut env, V1::Two, "find('hello world', 'goodbye')").unwrap(); + assert!(value.is_none()); + + let value = eval_v1_expr(&mut env, V1::Two, "find('hello\tBob', '\\t')").unwrap(); + assert_eq!(value.unwrap_string().as_str(), "\t"); + } +} diff --git a/wdl-engine/src/stdlib/floor.rs b/wdl-engine/src/stdlib/floor.rs new file mode 100644 index 000000000..d9dbd96b6 --- /dev/null +++ b/wdl-engine/src/stdlib/floor.rs @@ -0,0 +1,55 @@ +//! Implements the `floor` function from the WDL standard library. + +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_ast::Diagnostic; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::Value; + +/// Rounds a floating point number down to the next lower integer. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#floor +fn floor(context: CallContext<'_>) -> Result { + debug_assert_eq!(context.arguments.len(), 1); + debug_assert!(context.return_type_eq(PrimitiveTypeKind::Integer)); + + let arg = context + .coerce_argument(0, PrimitiveTypeKind::Float) + .unwrap_float(); + Ok((arg.floor() as i64).into()) +} + +/// Gets the function describing `floor`. +pub const fn descriptor() -> Function { + Function::new(const { &[Signature::new("(Float) -> Int", floor)] }) +} + +#[cfg(test)] +mod test { + use pretty_assertions::assert_eq; + use wdl_ast::version::V1; + + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + #[test] + fn floor() { + let mut env = TestEnv::default(); + let value = eval_v1_expr(&mut env, V1::Zero, "floor(10.5)").unwrap(); + assert_eq!(value.unwrap_integer(), 10); + + let value = eval_v1_expr(&mut env, V1::Zero, "floor(10)").unwrap(); + assert_eq!(value.unwrap_integer(), 10); + + let value = eval_v1_expr(&mut env, V1::Zero, "floor(9.9999)").unwrap(); + assert_eq!(value.unwrap_integer(), 9); + + let value = eval_v1_expr(&mut env, V1::Zero, "floor(0)").unwrap(); + assert_eq!(value.unwrap_integer(), 0); + + let value = eval_v1_expr(&mut env, V1::Zero, "floor(-5.1)").unwrap(); + assert_eq!(value.unwrap_integer(), -6); + } +} diff --git a/wdl-engine/src/stdlib/glob.rs b/wdl-engine/src/stdlib/glob.rs new file mode 100644 index 000000000..2fcc8533a --- /dev/null +++ b/wdl-engine/src/stdlib/glob.rs @@ -0,0 +1,162 @@ +//! Implements the `glob` function from the WDL standard library. + +use std::path::Path; +use std::sync::Arc; + +use wdl_analysis::stdlib::STDLIB as ANALYSIS_STDLIB; +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_ast::Diagnostic; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::Array; +use crate::PrimitiveValue; +use crate::Value; +use crate::diagnostics::function_call_failed; +use crate::diagnostics::invalid_glob_pattern; + +/// Returns the Bash expansion of the glob string relative to the task's +/// execution directory, and in the same order (i.e. lexicographical). +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#glob +fn glob(context: CallContext<'_>) -> Result { + debug_assert!(context.arguments.len() == 1); + debug_assert!(context.return_type_eq(ANALYSIS_STDLIB.array_file_type())); + + let path = context + .coerce_argument(0, PrimitiveTypeKind::String) + .unwrap_string(); + + let mut elements: Vec = Vec::new(); + for path in glob::glob(&context.cwd().join(path.as_str()).to_string_lossy()) + .map_err(|e| invalid_glob_pattern(&e, context.arguments[0].span))? + { + let path = path.map_err(|e| function_call_failed("glob", &e, context.call_site))?; + + // Filter out directories (only files are returned from WDL's `glob` function) + if path.is_dir() { + continue; + } + + // Strip the CWD prefix if there is one + let path = match path.strip_prefix(context.cwd()) { + Ok(path) => { + // Create a string from the stripped path + path.to_str() + .ok_or_else(|| { + function_call_failed( + "glob", + format!( + "path `{path}` cannot be represented as UTF-8", + path = path.display() + ), + context.call_site, + ) + })? + .to_string() + } + Err(_) => { + // Convert the path directly to a string + path.into_os_string().into_string().map_err(|path| { + function_call_failed( + "glob", + format!( + "path `{path}` cannot be represented as UTF-8", + path = Path::new(&path).display() + ), + context.call_site, + ) + })? + } + }; + + elements.push(PrimitiveValue::new_file(path).into()); + } + + Ok(Array::new_unchecked(context.return_type, Arc::new(elements)).into()) +} + +/// Gets the function describing `glob`. +pub const fn descriptor() -> Function { + Function::new(const { &[Signature::new("(String) -> Array[File]", glob)] }) +} + +#[cfg(test)] +mod test { + use std::fs; + + use pretty_assertions::assert_eq; + use wdl_ast::version::V1; + + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + #[test] + fn glob() { + let mut env = TestEnv::default(); + let diagnostic = eval_v1_expr(&mut env, V1::Two, "glob('invalid***')").unwrap_err(); + assert_eq!( + diagnostic.message(), + "invalid glob pattern specified: wildcards are either regular `*` or recursive `**`" + ); + + env.write_file("qux", "qux"); + env.write_file("baz", "baz"); + env.write_file("foo", "foo"); + env.write_file("bar", "bar"); + fs::create_dir_all(env.cwd().join("nested")).expect("failed to create directory"); + env.write_file("nested/bar", "bar"); + env.write_file("nested/baz", "baz"); + + let value = eval_v1_expr(&mut env, V1::Two, "glob('jam')").unwrap(); + let elements: Vec<_> = value + .as_array() + .unwrap() + .elements() + .iter() + .map(|v| v.as_file().unwrap().as_str()) + .collect(); + assert!(elements.is_empty()); + + let value = eval_v1_expr(&mut env, V1::Two, "glob('*')").unwrap(); + let elements: Vec<_> = value + .as_array() + .unwrap() + .elements() + .iter() + .map(|v| v.as_file().unwrap().as_str()) + .collect(); + assert_eq!(elements, ["bar", "baz", "foo", "qux"]); + + let value = eval_v1_expr(&mut env, V1::Two, "glob('ba?')").unwrap(); + let elements: Vec<_> = value + .as_array() + .unwrap() + .elements() + .iter() + .map(|v| v.as_file().unwrap().as_str()) + .collect(); + assert_eq!(elements, ["bar", "baz"]); + + let value = eval_v1_expr(&mut env, V1::Two, "glob('b*')").unwrap(); + let elements: Vec<_> = value + .as_array() + .unwrap() + .elements() + .iter() + .map(|v| v.as_file().unwrap().as_str()) + .collect(); + assert_eq!(elements, ["bar", "baz"]); + + let value = eval_v1_expr(&mut env, V1::Two, "glob('**/b*')").unwrap(); + let elements: Vec<_> = value + .as_array() + .unwrap() + .elements() + .iter() + .map(|v| v.as_file().unwrap().as_str().replace('\\', "/")) + .collect(); + assert_eq!(elements, ["bar", "baz", "nested/bar", "nested/baz"]); + } +} diff --git a/wdl-engine/src/stdlib/join_paths.rs b/wdl-engine/src/stdlib/join_paths.rs new file mode 100644 index 000000000..824ab1479 --- /dev/null +++ b/wdl-engine/src/stdlib/join_paths.rs @@ -0,0 +1,243 @@ +//! Implements the `join_paths` function from the WDL standard library. + +use std::path::Path; +use std::path::PathBuf; +use std::sync::Arc; + +use wdl_analysis::stdlib::STDLIB as ANALYSIS_STDLIB; +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_ast::Diagnostic; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::PrimitiveValue; +use crate::Value; +use crate::diagnostics::array_path_not_relative; +use crate::diagnostics::path_not_relative; + +/// Joins together two paths into an absolute path in the host +/// filesystem. +/// +/// `File join_paths(File, String)`: Joins together exactly two paths. The first +/// path may be either absolute or relative and must specify a directory; the +/// second path is relative to the first path and may specify a file or +/// directory. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#-join_paths +fn join_paths_simple(context: CallContext<'_>) -> Result { + debug_assert!(context.arguments.len() == 2); + debug_assert!(context.return_type_eq(PrimitiveTypeKind::File)); + + let first = context + .coerce_argument(0, PrimitiveTypeKind::File) + .unwrap_file(); + + let second = context + .coerce_argument(1, PrimitiveTypeKind::String) + .unwrap_string(); + + let second = Path::new(second.as_str()); + if !second.is_relative() { + return Err(path_not_relative(context.arguments[1].span)); + } + + let mut path = PathBuf::from(Arc::unwrap_or_clone(first)); + path.push(second); + + Ok(PrimitiveValue::new_file( + path.into_os_string() + .into_string() + .expect("should be UTF-8"), + ) + .into()) +} + +/// Joins together two or more paths into an absolute path in the host +/// filesystem. +/// +/// `File join_paths(File, Array[String]+)`: Joins together any number of +/// relative paths with a base path. The first argument may be either an +/// absolute or a relative path and must specify a directory. The paths in the +/// second array argument must all be relative. The last element may specify a +/// file or directory; all other elements must specify a directory. +/// +/// `File join_paths(Array[String]+)`: Joins together any number of paths. The +/// array must not be empty. The first element of the array may be either +/// absolute or relative; subsequent path(s) must be relative. The last element +/// may specify a file or directory; all other elements must specify a +/// directory. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#-join_paths +fn join_paths(context: CallContext<'_>) -> Result { + debug_assert!(!context.arguments.is_empty() && context.arguments.len() < 3); + debug_assert!(context.return_type_eq(PrimitiveTypeKind::File)); + + // Handle being provided one or two arguments + let (first, array, skip, array_span) = if context.arguments.len() == 1 { + let array = context + .coerce_argument(0, ANALYSIS_STDLIB.array_string_non_empty_type()) + .unwrap_array(); + + ( + array.elements()[0].clone().unwrap_string(), + array, + true, + context.arguments[0].span, + ) + } else { + let first = context + .coerce_argument(0, PrimitiveTypeKind::File) + .unwrap_file(); + + let array = context + .coerce_argument(1, ANALYSIS_STDLIB.array_string_non_empty_type()) + .unwrap_array(); + + (first, array, false, context.arguments[1].span) + }; + + let mut path = PathBuf::from(Arc::unwrap_or_clone(first)); + + for (i, element) in array + .elements() + .iter() + .enumerate() + .skip(if skip { 1 } else { 0 }) + { + let next = element.as_string().expect("element should be string"); + + let next = Path::new(next.as_str()); + if !next.is_relative() { + return Err(array_path_not_relative(i, array_span)); + } + + path.push(next); + } + + Ok(PrimitiveValue::new_file( + path.into_os_string() + .into_string() + .expect("should be UTF-8"), + ) + .into()) +} + +/// Gets the function describing `join_paths`. +pub const fn descriptor() -> Function { + Function::new( + const { + &[ + Signature::new("(File, String) -> File", join_paths_simple), + Signature::new("(File, Array[String]+) -> File", join_paths), + Signature::new("(Array[String]+) -> File", join_paths), + ] + }, + ) +} + +#[cfg(test)] +mod test { + use pretty_assertions::assert_eq; + use wdl_ast::version::V1; + + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + #[test] + fn join_paths() { + let mut env = TestEnv::default(); + let value = eval_v1_expr(&mut env, V1::Two, "join_paths('/usr', ['bin', 'echo'])").unwrap(); + assert_eq!( + value.unwrap_file().as_str().replace('\\', "/"), + "/usr/bin/echo" + ); + + let value = eval_v1_expr(&mut env, V1::Two, "join_paths(['/usr', 'bin', 'echo'])").unwrap(); + assert_eq!( + value.unwrap_file().as_str().replace('\\', "/"), + "/usr/bin/echo" + ); + + let value = eval_v1_expr(&mut env, V1::Two, "join_paths('mydir', 'mydata.txt')").unwrap(); + assert_eq!( + value.unwrap_file().as_str().replace('\\', "/"), + "mydir/mydata.txt" + ); + + let value = eval_v1_expr(&mut env, V1::Two, "join_paths('/usr', 'bin/echo')").unwrap(); + assert_eq!( + value.unwrap_file().as_str().replace('\\', "/"), + "/usr/bin/echo" + ); + + #[cfg(unix)] + { + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "join_paths('/usr', '/bin/echo')").unwrap_err(); + assert_eq!( + diagnostic.message(), + "path is required to be a relative path, but an absolute path was provided" + ); + + let diagnostic = eval_v1_expr( + &mut env, + V1::Two, + "join_paths('/usr', ['foo', '/bin/echo'])", + ) + .unwrap_err(); + assert_eq!( + diagnostic.message(), + "index 1 of the array is required to be a relative path, but an absolute path was \ + provided" + ); + + let diagnostic = eval_v1_expr( + &mut env, + V1::Two, + "join_paths(['/usr', 'foo', '/bin/echo'])", + ) + .unwrap_err(); + assert_eq!( + diagnostic.message(), + "index 2 of the array is required to be a relative path, but an absolute path was \ + provided" + ); + } + + #[cfg(windows)] + { + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "join_paths('C:\\usr', 'C:\\bin\\echo')") + .unwrap_err(); + assert_eq!( + diagnostic.message(), + "path is required to be a relative path, but an absolute path was provided" + ); + + let diagnostic = eval_v1_expr( + &mut env, + V1::Two, + "join_paths('C:\\usr', ['foo', 'C:\\bin\\echo'])", + ) + .unwrap_err(); + assert_eq!( + diagnostic.message(), + "index 1 of the array is required to be a relative path, but an absolute path was \ + provided" + ); + + let diagnostic = eval_v1_expr( + &mut env, + V1::Two, + "join_paths(['C:\\usr', 'foo', 'C:\\bin\\echo'])", + ) + .unwrap_err(); + assert_eq!( + diagnostic.message(), + "index 2 of the array is required to be a relative path, but an absolute path was \ + provided" + ); + } + } +} diff --git a/wdl-engine/src/stdlib/matches.rs b/wdl-engine/src/stdlib/matches.rs new file mode 100644 index 000000000..a9ae2503d --- /dev/null +++ b/wdl-engine/src/stdlib/matches.rs @@ -0,0 +1,65 @@ +//! Implements the `matches` function from the WDL standard library. + +use regex::Regex; +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_ast::Diagnostic; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::Value; +use crate::diagnostics::invalid_regex; + +/// Given two String parameters `input` and `pattern`, tests whether `pattern` +/// matches `input` at least once. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#-matches +fn matches(context: CallContext<'_>) -> Result { + debug_assert_eq!(context.arguments.len(), 2); + debug_assert!(context.return_type_eq(PrimitiveTypeKind::Boolean)); + + let input = context + .coerce_argument(0, PrimitiveTypeKind::String) + .unwrap_string(); + let pattern = context + .coerce_argument(1, PrimitiveTypeKind::String) + .unwrap_string(); + + let regex = + Regex::new(pattern.as_str()).map_err(|e| invalid_regex(&e, context.arguments[1].span))?; + Ok(regex.is_match(input.as_str()).into()) +} + +/// Gets the function describing `matches`. +pub const fn descriptor() -> Function { + Function::new(const { &[Signature::new("(String, String) -> Boolean", matches)] }) +} + +#[cfg(test)] +mod test { + use pretty_assertions::assert_eq; + use wdl_ast::version::V1; + + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + #[test] + fn matches() { + let mut env = TestEnv::default(); + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "matches('foo bar baz', '?')").unwrap_err(); + assert_eq!( + diagnostic.message(), + "regex parse error:\n ?\n ^\nerror: repetition operator missing expression" + ); + + let value = eval_v1_expr(&mut env, V1::Two, "matches('hello world', 'e..o')").unwrap(); + assert!(value.unwrap_boolean()); + + let value = eval_v1_expr(&mut env, V1::Two, "matches('hello world', 'goodbye')").unwrap(); + assert!(!value.unwrap_boolean()); + + let value = eval_v1_expr(&mut env, V1::Two, "matches('hello\tBob', '\\t')").unwrap(); + assert!(value.unwrap_boolean()); + } +} diff --git a/wdl-engine/src/stdlib/max.rs b/wdl-engine/src/stdlib/max.rs new file mode 100644 index 000000000..f91dd67af --- /dev/null +++ b/wdl-engine/src/stdlib/max.rs @@ -0,0 +1,136 @@ +//! Implements the `max` function from the WDL standard library. + +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_ast::Diagnostic; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::Value; + +/// Returns the larger of two integer values. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#max +fn int_max(context: CallContext<'_>) -> Result { + debug_assert_eq!(context.arguments.len(), 2); + debug_assert!(context.return_type_eq(PrimitiveTypeKind::Integer)); + + let first = context + .coerce_argument(0, PrimitiveTypeKind::Integer) + .unwrap_integer(); + let second = context + .coerce_argument(1, PrimitiveTypeKind::Integer) + .unwrap_integer(); + Ok(first.max(second).into()) +} + +/// Returns the larger of two float values. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#max +fn float_max(context: CallContext<'_>) -> Result { + debug_assert_eq!(context.arguments.len(), 2); + debug_assert!(context.return_type_eq(PrimitiveTypeKind::Float)); + + let first = context + .coerce_argument(0, PrimitiveTypeKind::Float) + .unwrap_float(); + let second = context + .coerce_argument(1, PrimitiveTypeKind::Float) + .unwrap_float(); + Ok(first.max(second).into()) +} + +/// Gets the function describing `max`. +pub const fn descriptor() -> Function { + Function::new( + const { + &[ + Signature::new("(Int, Int) -> Int", int_max), + Signature::new("(Int, Float) -> Float", float_max), + Signature::new("(Float, Int) -> Float", float_max), + Signature::new("(Float, Float) -> Float", float_max), + ] + }, + ) +} + +#[cfg(test)] +mod test { + use pretty_assertions::assert_eq; + use wdl_ast::version::V1; + + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + #[test] + fn max() { + let mut env = TestEnv::default(); + let value = eval_v1_expr(&mut env, V1::One, "max(7, 42)").unwrap(); + assert_eq!(value.unwrap_integer(), 42); + + let value = eval_v1_expr(&mut env, V1::One, "max(42, 7)").unwrap(); + assert_eq!(value.unwrap_integer(), 42); + + let value = eval_v1_expr(&mut env, V1::One, "max(-42, 7)").unwrap(); + assert_eq!(value.unwrap_integer(), 7); + + let value = eval_v1_expr(&mut env, V1::One, "max(0, -42)").unwrap(); + assert_eq!(value.unwrap_integer(), 0); + + let value = eval_v1_expr(&mut env, V1::One, "max(0, 42)").unwrap(); + assert_eq!(value.unwrap_integer(), 42); + + let value = eval_v1_expr(&mut env, V1::One, "max(7.0, 42)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 42.0); + + let value = eval_v1_expr(&mut env, V1::One, "max(42.0, 7)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 42.0); + + let value = eval_v1_expr(&mut env, V1::One, "max(-42.0, 7)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 7.0); + + let value = eval_v1_expr(&mut env, V1::One, "max(0.0, -42)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 0.0); + + let value = eval_v1_expr(&mut env, V1::One, "max(0.0, 42)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 42.0); + + let value = eval_v1_expr(&mut env, V1::One, "max(7, 42.0)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 42.0); + + let value = eval_v1_expr(&mut env, V1::One, "max(42, 7.0)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 42.0); + + let value = eval_v1_expr(&mut env, V1::One, "max(-42, 7.0)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 7.0); + + let value = eval_v1_expr(&mut env, V1::One, "max(0, -42.0)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 0.0); + + let value = eval_v1_expr(&mut env, V1::One, "max(0, 42.0)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 42.0); + + let value = eval_v1_expr(&mut env, V1::One, "max(7.0, 42.0)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 42.0); + + let value = eval_v1_expr(&mut env, V1::One, "max(42.0, 7.0)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 42.0); + + let value = eval_v1_expr(&mut env, V1::One, "max(-42.0, 7.0)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 7.0); + + let value = eval_v1_expr(&mut env, V1::One, "max(0.0, -42.0)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 0.0); + + let value = eval_v1_expr(&mut env, V1::One, "max(0.0, 42.0)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 42.0); + + let value = eval_v1_expr( + &mut env, + V1::One, + "max(12345, max(-100, max(54321, 1234.5678)))", + ) + .unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 54321.0); + } +} diff --git a/wdl-engine/src/stdlib/min.rs b/wdl-engine/src/stdlib/min.rs new file mode 100644 index 000000000..f0fde86d2 --- /dev/null +++ b/wdl-engine/src/stdlib/min.rs @@ -0,0 +1,136 @@ +//! Implements the `min` function from the WDL standard library. + +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_ast::Diagnostic; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::Value; + +/// Returns the smaller of two integer values. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#min +fn int_min(context: CallContext<'_>) -> Result { + debug_assert_eq!(context.arguments.len(), 2); + debug_assert!(context.return_type_eq(PrimitiveTypeKind::Integer)); + + let first = context + .coerce_argument(0, PrimitiveTypeKind::Integer) + .unwrap_integer(); + let second = context + .coerce_argument(1, PrimitiveTypeKind::Integer) + .unwrap_integer(); + Ok(first.min(second).into()) +} + +/// Returns the smaller of two float values. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#min +fn float_min(context: CallContext<'_>) -> Result { + debug_assert_eq!(context.arguments.len(), 2); + debug_assert!(context.return_type_eq(PrimitiveTypeKind::Float)); + + let first = context + .coerce_argument(0, PrimitiveTypeKind::Float) + .unwrap_float(); + let second = context + .coerce_argument(1, PrimitiveTypeKind::Float) + .unwrap_float(); + Ok(first.min(second).into()) +} + +/// Gets the function describing `min`. +pub const fn descriptor() -> Function { + Function::new( + const { + &[ + Signature::new("(Int, Int) -> Int", int_min), + Signature::new("(Int, Float) -> Float", float_min), + Signature::new("(Float, Int) -> Float", float_min), + Signature::new("(Float, Float) -> Float", float_min), + ] + }, + ) +} + +#[cfg(test)] +mod test { + use pretty_assertions::assert_eq; + use wdl_ast::version::V1; + + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + #[test] + fn min() { + let mut env = TestEnv::default(); + let value = eval_v1_expr(&mut env, V1::One, "min(7, 42)").unwrap(); + assert_eq!(value.unwrap_integer(), 7); + + let value = eval_v1_expr(&mut env, V1::One, "min(42, 7)").unwrap(); + assert_eq!(value.unwrap_integer(), 7); + + let value = eval_v1_expr(&mut env, V1::One, "min(-42, 7)").unwrap(); + assert_eq!(value.unwrap_integer(), -42); + + let value = eval_v1_expr(&mut env, V1::One, "min(0, -42)").unwrap(); + assert_eq!(value.unwrap_integer(), -42); + + let value = eval_v1_expr(&mut env, V1::One, "min(0, 42)").unwrap(); + assert_eq!(value.unwrap_integer(), 0); + + let value = eval_v1_expr(&mut env, V1::One, "min(7.0, 42)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 7.0); + + let value = eval_v1_expr(&mut env, V1::One, "min(42.0, 7)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 7.0); + + let value = eval_v1_expr(&mut env, V1::One, "min(-42.0, 7)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), -42.0); + + let value = eval_v1_expr(&mut env, V1::One, "min(0.0, -42)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), -42.0); + + let value = eval_v1_expr(&mut env, V1::One, "min(0.0, 42)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), -0.0); + + let value = eval_v1_expr(&mut env, V1::One, "min(7, 42.0)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 7.0); + + let value = eval_v1_expr(&mut env, V1::One, "min(42, 7.0)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 7.0); + + let value = eval_v1_expr(&mut env, V1::One, "min(-42, 7.0)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), -42.0); + + let value = eval_v1_expr(&mut env, V1::One, "min(0, -42.0)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), -42.0); + + let value = eval_v1_expr(&mut env, V1::One, "min(0, 42.0)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), -0.0); + + let value = eval_v1_expr(&mut env, V1::One, "min(7.0, 42.0)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 7.0); + + let value = eval_v1_expr(&mut env, V1::One, "min(42.0, 7.0)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 7.0); + + let value = eval_v1_expr(&mut env, V1::One, "min(-42.0, 7.0)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), -42.0); + + let value = eval_v1_expr(&mut env, V1::One, "min(0.0, -42.0)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), -42.0); + + let value = eval_v1_expr(&mut env, V1::One, "min(0.0, 42.0)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), -0.0); + + let value = eval_v1_expr( + &mut env, + V1::One, + "min(12345, min(-100, min(54321, 1234.5678)))", + ) + .unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), -100.0); + } +} diff --git a/wdl-engine/src/stdlib/read_boolean.rs b/wdl-engine/src/stdlib/read_boolean.rs new file mode 100644 index 000000000..e7c75d5d9 --- /dev/null +++ b/wdl-engine/src/stdlib/read_boolean.rs @@ -0,0 +1,121 @@ +//! Implements the `read_boolean` function from the WDL standard library. + +use std::fs; +use std::io::BufRead; +use std::io::BufReader; + +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_ast::Diagnostic; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::Value; +use crate::diagnostics::function_call_failed; + +/// Reads a file that contains a single line containing only a boolean value and +/// (optional) whitespace. +/// +/// If the non-whitespace content of the line is "true" or "false", that value +/// is returned as a Boolean. If the file is empty or does not contain a single +/// boolean, an error is raised. The comparison is case-insensitive. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#read_boolean +fn read_boolean(context: CallContext<'_>) -> Result { + debug_assert!(context.arguments.len() == 1); + debug_assert!(context.return_type_eq(PrimitiveTypeKind::Boolean)); + + let path = context.cwd().join( + context + .coerce_argument(0, PrimitiveTypeKind::File) + .unwrap_file() + .as_str(), + ); + + let read_error = |e: std::io::Error| { + function_call_failed( + "read_boolean", + format!("failed to read file `{path}`: {e}", path = path.display()), + context.call_site, + ) + }; + + let invalid_contents = || { + function_call_failed( + "read_boolean", + format!( + "file `{path}` does not contain a boolean value on a single line", + path = path.display() + ), + context.call_site, + ) + }; + + let mut lines = BufReader::new(fs::File::open(&path).map_err(read_error)?).lines(); + let mut line = lines + .next() + .ok_or_else(invalid_contents)? + .map_err(read_error)?; + + if lines.next().is_some() { + return Err(invalid_contents()); + } + + line.make_ascii_lowercase(); + Ok(line + .trim() + .parse::() + .map_err(|_| invalid_contents())? + .into()) +} + +/// Gets the function describing `read_boolean`. +pub const fn descriptor() -> Function { + Function::new(const { &[Signature::new("(File) -> Boolean", read_boolean)] }) +} + +#[cfg(test)] +mod test { + use wdl_ast::version::V1; + + use crate::PrimitiveValue; + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + #[test] + fn read_boolean() { + let mut env = TestEnv::default(); + env.write_file("foo", "true false hello world!"); + env.write_file("bar", "\t\tTrUe \n"); + env.write_file("baz", "\t\tfalse \n"); + env.insert_name("t", PrimitiveValue::new_file("bar")); + env.insert_name("f", PrimitiveValue::new_file("baz")); + + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "read_boolean('does-not-exist')").unwrap_err(); + assert!( + diagnostic + .message() + .starts_with("call to function `read_boolean` failed: failed to read file") + ); + + let diagnostic = eval_v1_expr(&mut env, V1::Two, "read_boolean('foo')").unwrap_err(); + assert!( + diagnostic + .message() + .contains("does not contain a boolean value on a single line") + ); + + let value = eval_v1_expr(&mut env, V1::Two, "read_boolean('bar')").unwrap(); + assert!(value.unwrap_boolean()); + + let value = eval_v1_expr(&mut env, V1::Two, "read_boolean(t)").unwrap(); + assert!(value.unwrap_boolean()); + + let value = eval_v1_expr(&mut env, V1::Two, "read_boolean('baz')").unwrap(); + assert!(!value.unwrap_boolean()); + + let value = eval_v1_expr(&mut env, V1::Two, "read_boolean(f)").unwrap(); + assert!(!value.unwrap_boolean()); + } +} diff --git a/wdl-engine/src/stdlib/read_float.rs b/wdl-engine/src/stdlib/read_float.rs new file mode 100644 index 000000000..4d9840795 --- /dev/null +++ b/wdl-engine/src/stdlib/read_float.rs @@ -0,0 +1,111 @@ +//! Implements the `read_float` function from the WDL standard library. + +use std::fs; +use std::io::BufRead; +use std::io::BufReader; + +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_ast::Diagnostic; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::Value; +use crate::diagnostics::function_call_failed; + +/// Reads a file that contains only a float value and (optional) whitespace. +/// +/// If the line contains a valid floating point number, that value is returned +/// as a Float. If the file is empty or does not contain a single float, an +/// error is raised. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#read_float +fn read_float(context: CallContext<'_>) -> Result { + debug_assert!(context.arguments.len() == 1); + debug_assert!(context.return_type_eq(PrimitiveTypeKind::Float)); + + let path = context.cwd().join( + context + .coerce_argument(0, PrimitiveTypeKind::File) + .unwrap_file() + .as_str(), + ); + + let read_error = |e: std::io::Error| { + function_call_failed( + "read_float", + format!("failed to read file `{path}`: {e}", path = path.display()), + context.call_site, + ) + }; + + let invalid_contents = || { + function_call_failed( + "read_float", + format!( + "file `{path}` does not contain a float value on a single line", + path = path.display() + ), + context.call_site, + ) + }; + + let mut lines = BufReader::new(fs::File::open(&path).map_err(read_error)?).lines(); + let line = lines + .next() + .ok_or_else(invalid_contents)? + .map_err(read_error)?; + + if lines.next().is_some() { + return Err(invalid_contents()); + } + + Ok(line + .trim() + .parse::() + .map_err(|_| invalid_contents())? + .into()) +} + +/// Gets the function describing `read_float`. +pub const fn descriptor() -> Function { + Function::new(const { &[Signature::new("(File) -> Float", read_float)] }) +} + +#[cfg(test)] +mod test { + use wdl_ast::version::V1; + + use crate::PrimitiveValue; + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + #[test] + fn read_float() { + let mut env = TestEnv::default(); + env.write_file("foo", "12345.6789 hello world!"); + env.write_file("bar", "\t \t 12345.6789 \n"); + env.insert_name("file", PrimitiveValue::new_file("bar")); + + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "read_float('does-not-exist')").unwrap_err(); + assert!( + diagnostic + .message() + .starts_with("call to function `read_float` failed: failed to read file") + ); + + let diagnostic = eval_v1_expr(&mut env, V1::Two, "read_float('foo')").unwrap_err(); + assert!( + diagnostic + .message() + .contains("does not contain a float value on a single line") + ); + + let value = eval_v1_expr(&mut env, V1::Two, "read_float('bar')").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 12345.6789); + + let value = eval_v1_expr(&mut env, V1::Two, "read_float(file)").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 12345.6789); + } +} diff --git a/wdl-engine/src/stdlib/read_int.rs b/wdl-engine/src/stdlib/read_int.rs new file mode 100644 index 000000000..ea13d3bb7 --- /dev/null +++ b/wdl-engine/src/stdlib/read_int.rs @@ -0,0 +1,111 @@ +//! Implements the `read_int` function from the WDL standard library. + +use std::fs; +use std::io::BufRead; +use std::io::BufReader; + +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_ast::Diagnostic; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::Value; +use crate::diagnostics::function_call_failed; + +/// Reads a file that contains a single line containing only an integer and +/// (optional) whitespace. +/// +/// If the line contains a valid integer, that value is returned as an Int. If +/// the file is empty or does not contain a single integer, an error is raised. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#read_int +fn read_int(context: CallContext<'_>) -> Result { + debug_assert!(context.arguments.len() == 1); + debug_assert!(context.return_type_eq(PrimitiveTypeKind::Integer)); + + let path = context.cwd().join( + context + .coerce_argument(0, PrimitiveTypeKind::File) + .unwrap_file() + .as_str(), + ); + + let read_error = |e: std::io::Error| { + function_call_failed( + "read_int", + format!("failed to read file `{path}`: {e}", path = path.display()), + context.call_site, + ) + }; + + let invalid_contents = || { + function_call_failed( + "read_int", + format!( + "file `{path}` does not contain an integer value on a single line", + path = path.display() + ), + context.call_site, + ) + }; + + let mut lines = BufReader::new(fs::File::open(&path).map_err(read_error)?).lines(); + let line = lines + .next() + .ok_or_else(invalid_contents)? + .map_err(read_error)?; + + if lines.next().is_some() { + return Err(invalid_contents()); + } + + Ok(line + .trim() + .parse::() + .map_err(|_| invalid_contents())? + .into()) +} + +/// Gets the function describing `read_int`. +pub const fn descriptor() -> Function { + Function::new(const { &[Signature::new("(File) -> Int", read_int)] }) +} + +#[cfg(test)] +mod test { + use pretty_assertions::assert_eq; + use wdl_ast::version::V1; + + use crate::PrimitiveValue; + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + #[test] + fn read_int() { + let mut env = TestEnv::default(); + env.write_file("foo", "12345 hello world!"); + env.write_file("bar", " \t \t12345 \n"); + env.insert_name("file", PrimitiveValue::new_file("bar")); + + let diagnostic = eval_v1_expr(&mut env, V1::Two, "read_int('does-not-exist')").unwrap_err(); + assert!( + diagnostic + .message() + .starts_with("call to function `read_int` failed: failed to read file") + ); + + let diagnostic = eval_v1_expr(&mut env, V1::Two, "read_int('foo')").unwrap_err(); + assert!( + diagnostic + .message() + .contains("does not contain an integer value on a single line") + ); + + let value = eval_v1_expr(&mut env, V1::Two, "read_int('bar')").unwrap(); + assert_eq!(value.unwrap_integer(), 12345); + + let value = eval_v1_expr(&mut env, V1::Two, "read_int(file)").unwrap(); + assert_eq!(value.unwrap_integer(), 12345); + } +} diff --git a/wdl-engine/src/stdlib/read_json.rs b/wdl-engine/src/stdlib/read_json.rs new file mode 100644 index 000000000..48f30f94f --- /dev/null +++ b/wdl-engine/src/stdlib/read_json.rs @@ -0,0 +1,178 @@ +//! Implements the `read_json` function from the WDL standard library. + +use std::fs; +use std::io::BufReader; + +use anyhow::Context; +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_analysis::types::Type; +use wdl_ast::Diagnostic; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::Value; +use crate::diagnostics::function_call_failed; + +/// Reads a JSON file into a WDL value whose type depends on the file's +/// contents. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#read_json +fn read_json(mut context: CallContext<'_>) -> Result { + debug_assert!(context.arguments.len() == 1); + debug_assert!(context.return_type_eq(Type::Union)); + + let path = context.cwd().join( + context + .coerce_argument(0, PrimitiveTypeKind::File) + .unwrap_file() + .as_str(), + ); + let file = fs::File::open(&path) + .with_context(|| format!("failed to open file `{path}`", path = path.display())) + .map_err(|e| function_call_failed("read_json", format!("{e:?}"), context.call_site))?; + + let mut deserializer = serde_json::Deserializer::from_reader(BufReader::new(file)); + Value::deserialize(context.types_mut(), &mut deserializer).map_err(|e| { + function_call_failed( + "read_json", + format!( + "failed to read JSON file `{path}`: {e}", + path = path.display() + ), + context.call_site, + ) + }) +} + +/// Gets the function describing `read_json`. +pub const fn descriptor() -> Function { + Function::new(const { &[Signature::new("(File) -> Union", read_json)] }) +} + +#[cfg(test)] +mod test { + use pretty_assertions::assert_eq; + use wdl_ast::version::V1; + + use crate::Value; + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + #[test] + fn read_json() { + let mut env = TestEnv::default(); + env.write_file("empty.json", ""); + env.write_file("not-json.json", "not json!"); + env.write_file("null.json", "null"); + env.write_file("true.json", "true"); + env.write_file("false.json", "false"); + env.write_file("string.json", r#""hello\nworld!""#); + env.write_file("int.json", r#"12345"#); + env.write_file("float.json", r#"12345.6789"#); + env.write_file("array.json", "[1, 2, 3]"); + env.write_file("bad_array.json", r#"[1, "2", 3]"#); + env.write_file( + "object.json", + r#"{ "foo": "bar", "bar": 12345, "baz": [1, 2, 3] }"#, + ); + env.write_file( + "bad_object.json", + r#"{ "foo": "bar", "bar!": 12345, "baz": [1, 2, 3] }"#, + ); + + let diagnostic = eval_v1_expr(&mut env, V1::One, "read_json('empty.json')").unwrap_err(); + assert!( + diagnostic + .message() + .contains("call to function `read_json` failed: failed to read JSON file") + ); + assert!( + diagnostic + .message() + .contains("EOF while parsing a value at line 1 column 0") + ); + + let diagnostic = eval_v1_expr(&mut env, V1::One, "read_json('not-json.json')").unwrap_err(); + assert!( + diagnostic + .message() + .contains("call to function `read_json` failed: failed to read JSON file") + ); + assert!( + diagnostic + .message() + .contains("expected ident at line 1 column 2") + ); + + let value = eval_v1_expr(&mut env, V1::One, "read_json('true.json')").unwrap(); + assert!(value.unwrap_boolean()); + + let value = eval_v1_expr(&mut env, V1::One, "read_json('false.json')").unwrap(); + assert!(!value.unwrap_boolean()); + + let value = eval_v1_expr(&mut env, V1::One, "read_json('string.json')").unwrap(); + assert_eq!(value.unwrap_string().as_str(), "hello\nworld!"); + + let value = eval_v1_expr(&mut env, V1::One, "read_json('int.json')").unwrap(); + assert_eq!(value.unwrap_integer(), 12345); + + let value = eval_v1_expr(&mut env, V1::One, "read_json('float.json')").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 12345.6789); + + let value = eval_v1_expr(&mut env, V1::One, "read_json('array.json')").unwrap(); + assert_eq!( + value + .unwrap_array() + .elements() + .iter() + .cloned() + .map(Value::unwrap_integer) + .collect::>(), + [1, 2, 3] + ); + + let diagnostic = + eval_v1_expr(&mut env, V1::One, "read_json('bad_array.json')").unwrap_err(); + assert!( + diagnostic + .message() + .contains("call to function `read_json` failed: failed to read JSON file") + ); + assert!( + diagnostic + .message() + .contains("a common element type does not exist between `Int` and `String`") + ); + + let value = eval_v1_expr(&mut env, V1::One, "read_json('object.json')") + .unwrap() + .unwrap_object(); + assert_eq!(value.members()["foo"].as_string().unwrap().as_str(), "bar"); + assert_eq!(value.members()["bar"].as_integer().unwrap(), 12345); + assert_eq!( + value.members()["baz"] + .as_array() + .unwrap() + .elements() + .iter() + .cloned() + .map(Value::unwrap_integer) + .collect::>(), + [1, 2, 3] + ); + + let diagnostic = + eval_v1_expr(&mut env, V1::One, "read_json('bad_object.json')").unwrap_err(); + assert!( + diagnostic + .message() + .contains("call to function `read_json` failed: failed to read JSON file") + ); + assert!( + diagnostic + .message() + .contains("object key `bar!` is not a valid WDL identifier") + ); + } +} diff --git a/wdl-engine/src/stdlib/read_lines.rs b/wdl-engine/src/stdlib/read_lines.rs new file mode 100644 index 000000000..c19f96107 --- /dev/null +++ b/wdl-engine/src/stdlib/read_lines.rs @@ -0,0 +1,117 @@ +//! Implements the `read_lines` function from the WDL standard library. + +use std::fs; +use std::io::BufRead; +use std::io::BufReader; +use std::sync::Arc; + +use anyhow::Context; +use wdl_analysis::stdlib::STDLIB as ANALYSIS_STDLIB; +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_ast::Diagnostic; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::Array; +use crate::PrimitiveValue; +use crate::Value; +use crate::diagnostics::function_call_failed; + +/// Reads each line of a file as a String, and returns all lines in the file as +/// an Array[String]. +/// +/// Trailing end-of-line characters (\r and \n) are removed from each line. +/// +/// The order of the lines in the returned Array[String] is the order in which +/// the lines appear in the file. +/// +/// If the file is empty, an empty array is returned. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#read_lines +fn read_lines(context: CallContext<'_>) -> Result { + debug_assert!(context.arguments.len() == 1); + debug_assert!(context.return_type_eq(ANALYSIS_STDLIB.array_string_type())); + + let path = context.cwd().join( + context + .coerce_argument(0, PrimitiveTypeKind::File) + .unwrap_file() + .as_str(), + ); + + let file = fs::File::open(&path) + .with_context(|| format!("failed to open file `{path}`", path = path.display())) + .map_err(|e| function_call_failed("read_lines", format!("{e:?}"), context.call_site))?; + + let elements = BufReader::new(file) + .lines() + .map(|line| { + Ok(PrimitiveValue::new_string( + line.with_context(|| { + format!("failed to read file `{path}`", path = path.display()) + }) + .map_err(|e| { + function_call_failed("read_lines", format!("{e:?}"), context.call_site) + })?, + ) + .into()) + }) + .collect::, _>>()?; + + Ok(Array::new_unchecked(context.return_type, Arc::new(elements)).into()) +} + +/// Gets the function describing `read_lines`. +pub const fn descriptor() -> Function { + Function::new(const { &[Signature::new("(File) -> Array[String]", read_lines)] }) +} + +#[cfg(test)] +mod test { + use pretty_assertions::assert_eq; + use wdl_ast::version::V1; + + use crate::PrimitiveValue; + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + #[test] + fn read_lines() { + let mut env = TestEnv::default(); + env.write_file("foo", "\nhello!\nworld!\n\r\nhi!\r\nthere!"); + env.write_file("empty", ""); + env.insert_name("file", PrimitiveValue::new_file("foo")); + + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "read_lines('does-not-exist')").unwrap_err(); + assert!( + diagnostic + .message() + .starts_with("call to function `read_lines` failed: failed to open file") + ); + + let value = eval_v1_expr(&mut env, V1::Two, "read_lines('foo')").unwrap(); + let elements: Vec<_> = value + .as_array() + .unwrap() + .elements() + .iter() + .map(|v| v.as_string().unwrap().as_str()) + .collect(); + assert_eq!(elements, ["", "hello!", "world!", "", "hi!", "there!"]); + + let value = eval_v1_expr(&mut env, V1::Two, "read_lines(file)").unwrap(); + let elements: Vec<_> = value + .as_array() + .unwrap() + .elements() + .iter() + .map(|v| v.as_string().unwrap().as_str()) + .collect(); + assert_eq!(elements, ["", "hello!", "world!", "", "hi!", "there!"]); + + let value = eval_v1_expr(&mut env, V1::Two, "read_lines('empty')").unwrap(); + assert!(value.unwrap_array().elements().is_empty()); + } +} diff --git a/wdl-engine/src/stdlib/read_map.rs b/wdl-engine/src/stdlib/read_map.rs new file mode 100644 index 000000000..52386c06c --- /dev/null +++ b/wdl-engine/src/stdlib/read_map.rs @@ -0,0 +1,147 @@ +//! Implements the `read_map` function from the WDL standard library. + +use std::fs; +use std::io::BufRead; +use std::io::BufReader; +use std::sync::Arc; + +use anyhow::Context; +use indexmap::IndexMap; +use wdl_analysis::stdlib::STDLIB as ANALYSIS_STDLIB; +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_ast::Diagnostic; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::Map; +use crate::PrimitiveValue; +use crate::Value; +use crate::diagnostics::function_call_failed; + +/// Reads a tab-separated value (TSV) file representing a set of pairs. +/// +/// Each row must have exactly two columns, e.g., col1\tcol2. +/// +/// Trailing end-of-line characters (\r and \n) are removed from each line. +/// +/// Each pair is added to a Map[String, String] in order. +/// +/// The values in the first column must be unique; if there are any duplicate +/// keys, an error is raised. +/// +/// If the file is empty, an empty map is returned. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#read_map +fn read_map(context: CallContext<'_>) -> Result { + debug_assert!(context.arguments.len() == 1); + debug_assert!(context.return_type_eq(ANALYSIS_STDLIB.map_string_string_type())); + + let path = context.cwd().join( + context + .coerce_argument(0, PrimitiveTypeKind::File) + .unwrap_file() + .as_str(), + ); + let file = fs::File::open(&path) + .with_context(|| format!("failed to open file `{path}`", path = path.display())) + .map_err(|e| function_call_failed("read_map", format!("{e:?}"), context.call_site))?; + + let mut map: IndexMap = IndexMap::new(); + for (i, line) in BufReader::new(file).lines().enumerate() { + let line = line + .with_context(|| format!("failed to read file `{path}`", path = path.display())) + .map_err(|e| function_call_failed("read_map", format!("{e:?}"), context.call_site))?; + + let (key, value) = match line.split_once('\t') { + Some((key, value)) if !value.contains('\t') => (key, value), + _ => { + return Err(function_call_failed( + "read_map", + format!( + "line {i} in file `{path}` does not contain exactly two columns", + i = i + 1, + path = path.display() + ), + context.call_site, + )); + } + }; + + if map + .insert( + PrimitiveValue::new_string(key), + PrimitiveValue::new_string(value).into(), + ) + .is_some() + { + return Err(function_call_failed( + "read_map", + format!( + "line {i} in file `{path}` contains duplicate key name `{key}`", + i = i + 1, + path = path.display() + ), + context.call_site, + )); + } + } + + Ok(Map::new_unchecked(ANALYSIS_STDLIB.map_string_string_type(), Arc::new(map)).into()) +} + +/// Gets the function describing `read_map`. +pub const fn descriptor() -> Function { + Function::new(const { &[Signature::new("(File) -> Map[String, String]", read_map)] }) +} + +#[cfg(test)] +mod test { + use pretty_assertions::assert_eq; + use wdl_ast::version::V1; + + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + #[test] + fn read_map() { + let mut env = TestEnv::default(); + env.write_file("empty.tsv", ""); + env.write_file("map.tsv", "foo\tbar\nbaz\tqux\njam\tcakes\n"); + env.write_file("wrong.tsv", "foo\tbar\nbaz\tqux\twrong\njam\tcakes\n"); + env.write_file("duplicate.tsv", "foo\tbar\nbaz\tqux\nfoo\tcakes\n"); + + let diagnostic = eval_v1_expr(&mut env, V1::Two, "read_map('wrong.tsv')").unwrap_err(); + assert!( + diagnostic + .message() + .contains("call to function `read_map` failed: line 2 in file") + ); + assert!( + diagnostic + .message() + .contains("does not contain exactly two columns") + ); + + let diagnostic = eval_v1_expr(&mut env, V1::Two, "read_map('duplicate.tsv')").unwrap_err(); + assert!( + diagnostic + .message() + .contains("call to function `read_map` failed: line 3 in file") + ); + assert!( + diagnostic + .message() + .contains("contains duplicate key name `foo`") + ); + + let value = eval_v1_expr(&mut env, V1::Two, "read_map('empty.tsv')").unwrap(); + assert_eq!(value.unwrap_map().to_string(), "{}"); + + let value = eval_v1_expr(&mut env, V1::Two, "read_map('map.tsv')").unwrap(); + assert_eq!( + value.unwrap_map().to_string(), + r#"{"foo": "bar", "baz": "qux", "jam": "cakes"}"# + ); + } +} diff --git a/wdl-engine/src/stdlib/read_object.rs b/wdl-engine/src/stdlib/read_object.rs new file mode 100644 index 000000000..b075e000a --- /dev/null +++ b/wdl-engine/src/stdlib/read_object.rs @@ -0,0 +1,224 @@ +//! Implements the `read_object` function from the WDL standard library. + +use std::fs; +use std::io::BufRead; +use std::io::BufReader; + +use anyhow::Context; +use indexmap::IndexMap; +use itertools::EitherOrBoth; +use itertools::Itertools; +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_analysis::types::Type; +use wdl_ast::Diagnostic; +use wdl_grammar::lexer::v1::is_ident; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::Object; +use crate::PrimitiveValue; +use crate::Value; +use crate::diagnostics::function_call_failed; + +/// Reads a tab-separated value (TSV) file representing the names and values of +/// the members of an Object. +/// +/// There must be exactly two rows, and each row must have the same number of +/// elements, otherwise an error is raised. +/// +/// Trailing end-of-line characters (\r and \n) are removed from each line. +/// +/// The first row specifies the object member names. The names in the first row +/// must be unique; if there are any duplicate names, an error is raised. +/// +/// The second row specifies the object member values corresponding to the names +/// in the first row. All of the Object's values are of type String. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#read_object +fn read_object(context: CallContext<'_>) -> Result { + debug_assert!(context.arguments.len() == 1); + debug_assert!(context.return_type_eq(Type::Object)); + + let path = context.cwd().join( + context + .coerce_argument(0, PrimitiveTypeKind::File) + .unwrap_file() + .as_str(), + ); + + let expected_two_lines = || { + function_call_failed( + "read_object", + format!( + "expected exactly two lines in file `{path}`", + path = path.display() + ), + context.call_site, + ) + }; + + let file = fs::File::open(&path) + .with_context(|| format!("failed to open file `{path}`", path = path.display())) + .map_err(|e| function_call_failed("read_object", format!("{e:?}"), context.call_site))?; + + let mut lines = BufReader::new(file).lines(); + let names = lines + .next() + .ok_or_else(expected_two_lines)? + .with_context(|| format!("failed to read file `{path}`", path = path.display())) + .map_err(|e| function_call_failed("read_object", format!("{e:?}"), context.call_site))?; + + let values = lines + .next() + .ok_or_else(expected_two_lines)? + .with_context(|| format!("failed to read file `{path}`", path = path.display())) + .map_err(|e| function_call_failed("read_object", format!("{e:?}"), context.call_site))?; + + if lines.next().is_some() { + return Err(expected_two_lines()); + } + + let mut members = IndexMap::new(); + for e in names.split('\t').zip_longest(values.split('\t')) { + match e { + EitherOrBoth::Both(name, value) => { + if !is_ident(name) { + return Err(function_call_failed( + "read_object", + format!( + "invalid column name `{name}` at {path}:1: column name must be a \ + valid WDL identifier", + path = path.display() + ), + context.call_site, + )); + } + + if members + .insert(name.to_string(), PrimitiveValue::new_string(value).into()) + .is_some() + { + return Err(function_call_failed( + "read_object", + format!( + "duplicate column name `{name}` at {path}:1", + path = path.display() + ), + context.call_site, + )); + } + } + EitherOrBoth::Left(_) | EitherOrBoth::Right(_) => { + return Err(function_call_failed( + "read_object", + format!( + "line 2 of file `{path}` does not contain the expected number of columns", + path = path.display() + ), + context.call_site, + )); + } + } + } + + Ok(Object::from(members).into()) +} + +/// Gets the function describing `read_object`. +pub const fn descriptor() -> Function { + Function::new(const { &[Signature::new("(File) -> Object", read_object)] }) +} + +#[cfg(test)] +mod test { + use pretty_assertions::assert_eq; + use wdl_ast::version::V1; + + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + #[test] + fn read_object() { + let mut env = TestEnv::default(); + env.write_file("empty.tsv", ""); + env.write_file("object.tsv", "foo\tbar\nbaz\tqux"); + env.write_file("too-many-lines.tsv", "foo\tbar\nbaz\tqux\njam\tcakes\n"); + env.write_file("too-few-lines.tsv", "foo\tbar\n"); + env.write_file("too-few-columns.tsv", "foo\tbar\nbaz\n"); + env.write_file("too-many-columns.tsv", "foo\tbar\nbaz\tqux\twrong\n"); + env.write_file("duplicate.tsv", "foo\tbar\tfoo\nbaz\tqux\tfoo\n"); + env.write_file("invalid-name.tsv", "foo\tbar-wrong\tfoo\nbaz\tqux\tfoo\n"); + + let diagnostic = eval_v1_expr(&mut env, V1::Two, "read_object('empty.tsv')").unwrap_err(); + assert!( + diagnostic.message().contains( + "call to function `read_object` failed: expected exactly two lines in file" + ) + ); + + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "read_object('too-many-lines.tsv')").unwrap_err(); + assert!( + diagnostic.message().contains( + "call to function `read_object` failed: expected exactly two lines in file" + ) + ); + + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "read_object('too-few-lines.tsv')").unwrap_err(); + assert!( + diagnostic.message().contains( + "call to function `read_object` failed: expected exactly two lines in file" + ) + ); + + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "read_object('too-many-columns.tsv')").unwrap_err(); + assert!( + diagnostic + .message() + .contains("call to function `read_object` failed: line 2 of file") + ); + assert!( + diagnostic + .message() + .contains("does not contain the expected number of columns") + ); + + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "read_object('too-few-columns.tsv')").unwrap_err(); + assert!( + diagnostic + .message() + .contains("call to function `read_object` failed: line 2 of file") + ); + assert!( + diagnostic + .message() + .contains("does not contain the expected number of columns") + ); + + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "read_object('duplicate.tsv')").unwrap_err(); + assert!( + diagnostic + .message() + .starts_with("call to function `read_object` failed: duplicate column name `foo`") + ); + + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "read_object('invalid-name.tsv')").unwrap_err(); + assert!( + diagnostic.message().starts_with( + "call to function `read_object` failed: invalid column name `bar-wrong`" + ) + ); + + let value = eval_v1_expr(&mut env, V1::Two, "read_object('object.tsv')").unwrap(); + assert_eq!( + value.unwrap_object().to_string(), + r#"object {foo: "baz", bar: "qux"}"# + ); + } +} diff --git a/wdl-engine/src/stdlib/read_objects.rs b/wdl-engine/src/stdlib/read_objects.rs new file mode 100644 index 000000000..6f6567b53 --- /dev/null +++ b/wdl-engine/src/stdlib/read_objects.rs @@ -0,0 +1,215 @@ +//! Implements the `read_objects` function from the WDL standard library. + +use std::fs; +use std::io::BufRead; +use std::io::BufReader; +use std::sync::Arc; + +use anyhow::Context; +use indexmap::IndexMap; +use itertools::EitherOrBoth; +use itertools::Itertools; +use wdl_analysis::stdlib::STDLIB as ANALYSIS_STDLIB; +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_ast::Diagnostic; +use wdl_grammar::lexer::v1::is_ident; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::Array; +use crate::Object; +use crate::PrimitiveValue; +use crate::Value; +use crate::diagnostics::function_call_failed; + +/// Reads a tab-separated value (TSV) file representing the names and values of +/// the members of any number of Objects. +/// +/// Trailing end-of-line characters (\r and \n) are removed from each line. +/// +/// The first line of the file must be a header row with the names of the object +/// members. The names in the first row must be unique; if there are any +/// duplicate names, an error is raised. +/// +/// There are any number of additional rows, where each additional row contains +/// the values of an object corresponding to the member names. Each row in the +/// file must have the same number of fields as the header row. All of the +/// Object's values are of type String. +/// +/// If the file is empty or contains only a header line, an empty array is +/// returned. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#read_objects +fn read_objects(context: CallContext<'_>) -> Result { + debug_assert!(context.arguments.len() == 1); + debug_assert!(context.return_type_eq(ANALYSIS_STDLIB.array_object_type())); + + let path = context.cwd().join( + context + .coerce_argument(0, PrimitiveTypeKind::File) + .unwrap_file() + .as_str(), + ); + + let file = fs::File::open(&path) + .with_context(|| format!("failed to open file `{path}`", path = path.display())) + .map_err(|e| function_call_failed("read_objects", format!("{e:?}"), context.call_site))?; + + let mut lines = BufReader::new(file).lines(); + let names = match lines.next() { + Some(line) => line + .with_context(|| format!("failed to read file `{path}`", path = path.display())) + .map_err(|e| { + function_call_failed("read_objects", format!("{e:?}"), context.call_site) + })?, + None => { + return Ok(Array::new_unchecked( + ANALYSIS_STDLIB.array_object_type(), + Arc::new(Vec::new()), + ) + .into()); + } + }; + + for name in names.split('\t') { + if !is_ident(name) { + return Err(function_call_failed( + "read_objects", + format!( + "invalid column name `{name}` at {path}:1: column name must be a valid WDL \ + identifier", + path = path.display() + ), + context.call_site, + )); + } + } + + let mut objects = Vec::new(); + for (i, line) in lines.enumerate() { + let line = line + .with_context(|| format!("failed to read file `{path}`", path = path.display())) + .map_err(|e| { + function_call_failed("read_objects", format!("{e:?}"), context.call_site) + })?; + + let mut members = IndexMap::new(); + for e in names.split('\t').zip_longest(line.split('\t')) { + match e { + EitherOrBoth::Both(name, value) => { + if members + .insert(name.to_string(), PrimitiveValue::new_string(value).into()) + .is_some() + { + return Err(function_call_failed( + "read_objects", + format!( + "duplicate column name `{name}` at {path}:1", + path = path.display() + ), + context.call_site, + )); + } + } + EitherOrBoth::Left(_) | EitherOrBoth::Right(_) => { + return Err(function_call_failed( + "read_objects", + format!( + "line {i} of file `{path}` does not contain the expected number of \ + columns", + i = i + 2, + path = path.display() + ), + context.call_site, + )); + } + } + } + + objects.push(Object::from(members).into()); + } + + Ok(Array::new_unchecked(ANALYSIS_STDLIB.array_object_type(), Arc::new(objects)).into()) +} + +/// Gets the function describing `read_objects`. +pub const fn descriptor() -> Function { + Function::new(const { &[Signature::new("(File) -> Array[Object]", read_objects)] }) +} + +#[cfg(test)] +mod test { + use pretty_assertions::assert_eq; + use wdl_ast::version::V1; + + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + #[test] + fn read_objects() { + let mut env = TestEnv::default(); + env.write_file("empty.tsv", ""); + env.write_file( + "objects.tsv", + "k0\tk1\tk2\na0\ta1\ta2\nb0\tb1\tb2\nc0\tc1\tc2\n", + ); + env.write_file("only-header.tsv", "foo\tbar\n"); + env.write_file("too-few-columns.tsv", "foo\tbar\nbaz\n"); + env.write_file("too-many-columns.tsv", "foo\tbar\nbaz\tqux\twrong\n"); + env.write_file("duplicate.tsv", "foo\tbar\tfoo\nbaz\tqux\tfoo\n"); + env.write_file("invalid-name.tsv", "foo\tbar-wrong\tfoo\nbaz\tqux\tfoo\n"); + + let value = eval_v1_expr(&mut env, V1::Two, "read_objects('empty.tsv')").unwrap(); + assert!(value.unwrap_array().elements().is_empty()); + + let value = eval_v1_expr(&mut env, V1::Two, "read_objects('only-header.tsv')").unwrap(); + assert!(value.unwrap_array().elements().is_empty()); + + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "read_objects('too-many-columns.tsv')").unwrap_err(); + assert!( + diagnostic + .message() + .contains("call to function `read_objects` failed: line 2 of file") + ); + assert!( + diagnostic + .message() + .contains("does not contain the expected number of columns") + ); + + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "read_objects('too-few-columns.tsv')").unwrap_err(); + assert!( + diagnostic + .message() + .contains("call to function `read_objects` failed: line 2 of file") + ); + assert!( + diagnostic + .message() + .contains("does not contain the expected number of columns") + ); + + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "read_objects('duplicate.tsv')").unwrap_err(); + assert!( + diagnostic + .message() + .starts_with("call to function `read_objects` failed: duplicate column name `foo`") + ); + + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "read_objects('invalid-name.tsv')").unwrap_err(); + assert!(diagnostic.message().starts_with( + "call to function `read_objects` failed: invalid column name `bar-wrong`" + )); + + let value = eval_v1_expr(&mut env, V1::Two, "read_objects('objects.tsv')").unwrap(); + assert_eq!( + value.unwrap_array().to_string(), + r#"[object {k0: "a0", k1: "a1", k2: "a2"}, object {k0: "b0", k1: "b1", k2: "b2"}, object {k0: "c0", k1: "c1", k2: "c2"}]"# + ); + } +} diff --git a/wdl-engine/src/stdlib/read_string.rs b/wdl-engine/src/stdlib/read_string.rs new file mode 100644 index 000000000..55034be52 --- /dev/null +++ b/wdl-engine/src/stdlib/read_string.rs @@ -0,0 +1,78 @@ +//! Implements the `read_string` function from the WDL standard library. + +use std::fs; + +use anyhow::Context; +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_ast::Diagnostic; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::PrimitiveValue; +use crate::Value; +use crate::diagnostics::function_call_failed; + +/// Reads an entire file as a String, with any trailing end-of-line characters +/// (\r and \n) stripped off. +/// +/// If the file is empty, an empty string is returned. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#read_string +fn read_string(context: CallContext<'_>) -> Result { + debug_assert!(context.arguments.len() == 1); + debug_assert!(context.return_type_eq(PrimitiveTypeKind::String)); + + let path = context.cwd().join( + context + .coerce_argument(0, PrimitiveTypeKind::File) + .unwrap_file() + .as_str(), + ); + let mut contents = fs::read_to_string(&path) + .with_context(|| format!("failed to read file `{path}`", path = path.display())) + .map_err(|e| function_call_failed("read_string", format!("{e:?}"), context.call_site))?; + + let trimmed = contents.trim_end_matches(['\r', '\n']); + contents.truncate(trimmed.len()); + Ok(PrimitiveValue::new_string(contents).into()) +} + +/// Gets the function describing `read_string`. +pub const fn descriptor() -> Function { + Function::new(const { &[Signature::new("(File) -> String", read_string)] }) +} + +#[cfg(test)] +mod test { + use pretty_assertions::assert_eq; + use wdl_ast::version::V1; + + use crate::PrimitiveValue; + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + #[test] + fn read_string() { + let mut env = TestEnv::default(); + env.write_file("foo", "hello\nworld!\n\r\n"); + env.insert_name( + "file", + PrimitiveValue::new_file(env.cwd().join("foo").to_str().expect("should be UTF-8")), + ); + + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "read_string('does-not-exist')").unwrap_err(); + assert!( + diagnostic + .message() + .starts_with("call to function `read_string` failed: failed to read file") + ); + + let value = eval_v1_expr(&mut env, V1::Two, "read_string('foo')").unwrap(); + assert_eq!(value.unwrap_string().as_str(), "hello\nworld!"); + + let value = eval_v1_expr(&mut env, V1::Two, "read_string(file)").unwrap(); + assert_eq!(value.unwrap_string().as_str(), "hello\nworld!"); + } +} diff --git a/wdl-engine/src/stdlib/read_tsv.rs b/wdl-engine/src/stdlib/read_tsv.rs new file mode 100644 index 000000000..bebd93464 --- /dev/null +++ b/wdl-engine/src/stdlib/read_tsv.rs @@ -0,0 +1,476 @@ +//! Implements the `read_tsv` function from the WDL standard library. + +use std::fs; +use std::io::BufRead; +use std::io::BufReader; +use std::sync::Arc; + +use anyhow::Context; +use indexmap::IndexMap; +use itertools::Either; +use itertools::EitherOrBoth; +use itertools::Itertools; +use wdl_analysis::stdlib::STDLIB as ANALYSIS_STDLIB; +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_ast::Diagnostic; +use wdl_grammar::lexer::v1::is_ident; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::Array; +use crate::CompoundValue; +use crate::PrimitiveValue; +use crate::Value; +use crate::diagnostics::function_call_failed; + +/// Represents a header in a TSV (tab-separated value) file. +enum TsvHeader { + /// The header was explicitly specified as an `Array[String]`. + Specified(Array), + /// The header was read from the file. + File(String), +} + +impl TsvHeader { + /// Gets the column names in the header. + /// + /// # Panics + /// + /// Panics if a specified header contains a value that is not a string. + pub fn columns(&self) -> impl Iterator { + match self { + Self::Specified(array) => Either::Left(array.elements().iter().map(|v| { + v.as_string() + .expect("header value must be a string") + .as_str() + })), + Self::File(s) => Either::Right(s.split('\t')), + } + } +} + +/// Reads a tab-separated value (TSV) file as an Array[Array[String]] +/// representing a table of values. +/// +/// Trailing end-of-line characters (\r and \n) are removed from each line. +/// +/// `Array[Array[String]] read_tsv(File, [false])`: Returns each row of the +/// table as an Array[String]. There is no requirement that the rows of the +/// table are all the same length. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#read_tsv +fn read_tsv_simple(context: CallContext<'_>) -> Result { + debug_assert!(context.arguments.len() == 1); + debug_assert!(context.return_type_eq(ANALYSIS_STDLIB.array_array_string_type())); + + let path = context.cwd().join( + context + .coerce_argument(0, PrimitiveTypeKind::File) + .unwrap_file() + .as_str(), + ); + + let file = fs::File::open(&path) + .with_context(|| format!("failed to open file `{path}`", path = path.display())) + .map_err(|e| function_call_failed("read_tsv", format!("{e:?}"), context.call_site))?; + + let mut rows: Vec = Vec::new(); + for line in BufReader::new(file).lines() { + let line = line + .with_context(|| format!("failed to read file `{path}`", path = path.display())) + .map_err(|e| function_call_failed("read_tsv", format!("{e:?}"), context.call_site))?; + let values = line + .split('\t') + .map(|s| PrimitiveValue::new_string(s).into()) + .collect::>(); + rows.push( + Array::new_unchecked(ANALYSIS_STDLIB.array_string_type(), Arc::new(values)).into(), + ); + } + + Ok(Array::new_unchecked(ANALYSIS_STDLIB.array_array_string_type(), Arc::new(rows)).into()) +} + +/// Reads a tab-separated value (TSV) file as an Array[Object] representing a +/// table of values. +/// +/// Trailing end-of-line characters (\r and \n) are removed from each line. +/// +/// `Array[Object] read_tsv(File, true)`: The second parameter must be true and +/// specifies that the TSV file contains a header line. Each row is returned as +/// an Object with its keys determined by the header (the first line in the +/// file) and its values as Strings. All rows in the file must be the same +/// length and the field names in the header row must be valid Object field +/// names, or an error is raised. +/// +/// `Array[Object] read_tsv(File, Boolean, Array[String])`: The second +/// parameter specifies whether the TSV file contains a header line, and the +/// third parameter is an array of field names that is used to specify the field +/// names to use for the returned Objects. If the second parameter is true, the +/// specified field names override those in the file's header (i.e., the header +/// line is ignored). +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#read_tsv +fn read_tsv(context: CallContext<'_>) -> Result { + debug_assert!(context.arguments.len() >= 2 && context.arguments.len() <= 3); + debug_assert!(context.return_type_eq(ANALYSIS_STDLIB.array_object_type())); + + let path = context.cwd().join( + context + .coerce_argument(0, PrimitiveTypeKind::File) + .unwrap_file() + .as_str(), + ); + + let file = fs::File::open(&path) + .with_context(|| format!("failed to open file `{path}`", path = path.display())) + .map_err(|e| function_call_failed("read_tsv", format!("{e:?}"), context.call_site))?; + + let mut lines = BufReader::new(file).lines(); + + // Read the file header if there is one; ignore it if the header was directly + // specified. + let file_has_header = context + .coerce_argument(1, PrimitiveTypeKind::Boolean) + .unwrap_boolean(); + let header = if context.arguments.len() == 3 { + if file_has_header { + lines.next(); + } + + TsvHeader::Specified( + context + .coerce_argument(2, ANALYSIS_STDLIB.array_string_type()) + .unwrap_array(), + ) + } else if !file_has_header { + return Err(function_call_failed( + "read_tsv", + "argument specifying presence of a file header must be `true`", + context.arguments[1].span, + )); + } else { + TsvHeader::File( + lines + .next() + .unwrap_or_else(|| Ok(String::default())) + .with_context(|| format!("failed to read file `{path}`", path = path.display())) + .map_err(|e| { + function_call_failed("read_tsv", format!("{e:?}"), context.call_site) + })?, + ) + }; + + let mut column_count = 0; + if let Some(invalid) = header.columns().find(|c| { + column_count += 1; + !is_ident(c) + }) { + return Err(function_call_failed( + "read_tsv", + if context.arguments.len() == 2 { + format!( + "column name `{invalid}` in file `{path}` is not a valid WDL object field name", + path = path.display() + ) + } else { + format!("specified name `{invalid}` is not a valid WDL object field name") + }, + context.call_site, + )); + } + + let mut rows: Vec = Vec::new(); + for (index, line) in lines.enumerate() { + let line = line + .with_context(|| format!("failed to read file `{path}`", path = path.display())) + .map_err(|e| function_call_failed("read_tsv", format!("{e:?}"), context.call_site))?; + + let mut members: IndexMap = IndexMap::with_capacity(column_count); + + for e in header.columns().zip_longest(line.split('\t')) { + match e { + EitherOrBoth::Both(c, v) => { + if members + .insert(c.to_string(), PrimitiveValue::new_string(v).into()) + .is_some() + { + return Err(function_call_failed( + "read_tsv", + if context.arguments.len() == 2 { + format!( + "duplicate column name `{c}` found in file `{path}`", + path = path.display() + ) + } else { + format!("duplicate column name `{c}` was specified") + }, + context.call_site, + )); + } + } + _ => { + return Err(function_call_failed( + "read_tsv", + format!( + "line {index} in file `{path}` does not have the expected number of \ + columns", + index = index + 1 + if file_has_header { 1 } else { 0 }, + path = path.display() + ), + context.call_site, + )); + } + } + } + + rows.push(CompoundValue::Object(members.into()).into()); + } + + Ok(Array::new_unchecked(ANALYSIS_STDLIB.array_object_type(), Arc::new(rows)).into()) +} + +/// Gets the function describing `read_tsv`. +pub const fn descriptor() -> Function { + Function::new( + const { + &[ + Signature::new("(File) -> Array[Array[String]]", read_tsv_simple), + Signature::new("(File, Boolean) -> Array[Object]", read_tsv), + Signature::new("(File, Boolean, Array[String]) -> Array[Object]", read_tsv), + ] + }, + ) +} + +#[cfg(test)] +mod test { + use pretty_assertions::assert_eq; + use wdl_ast::version::V1; + + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + #[test] + fn read_tsv() { + let mut env = TestEnv::default(); + env.write_file( + "foo.tsv", + "row1_1\trow1_2\trow1_3\nrow2_1\trow2_2\trow2_3\trow2_4\nrow3_1\trow3_2\n", + ); + env.write_file( + "bar.tsv", + "foo\tbar\tbaz\nrow1_1\trow1_2\trow1_3\nrow2_1\trow2_2\trow2_3\nrow3_1\trow3_2\trow3_3", + ); + env.write_file( + "baz.tsv", + "row1_1\trow1_2\trow1_3\nrow2_1\trow2_2\trow2_3\nrow3_1\trow3_2\trow3_3", + ); + env.write_file("empty.tsv", ""); + env.write_file("invalid_name.tsv", "invalid-name\nfoo"); + env.write_file( + "missing_column.tsv", + "foo\tbar\tbaz\nnrow1_1\trow1_2\trow1_3\nrow2_1\trow2_3\nrow3_1\trow3_2\trow3_3", + ); + env.write_file( + "duplicate_column_name.tsv", + "foo\tbar\tfoo\nrow1_1\trow1_2\trow1_3\nrow2_1\trow2_2\trow2_3\nrow3_1\trow3_2\trow3_3", + ); + + let diagnostic = eval_v1_expr(&mut env, V1::Two, "read_tsv('unknown.tsv')").unwrap_err(); + assert!( + diagnostic + .message() + .contains("call to function `read_tsv` failed: failed to open file") + ); + + let value = eval_v1_expr(&mut env, V1::Two, "read_tsv('empty.tsv')").unwrap(); + assert!(value.unwrap_array().elements().is_empty()); + + let diagnostic = eval_v1_expr(&mut env, V1::Two, "read_tsv('foo.tsv', false)").unwrap_err(); + assert_eq!( + diagnostic.message(), + "call to function `read_tsv` failed: argument specifying presence of a file header \ + must be `true`" + ); + + let value = eval_v1_expr(&mut env, V1::Two, "read_tsv('foo.tsv')").unwrap(); + let elements = value + .as_array() + .unwrap() + .elements() + .iter() + .map(|v| { + v.as_array() + .unwrap() + .elements() + .iter() + .map(|v| v.as_string().unwrap().as_str()) + .collect::>() + }) + .collect::>(); + assert_eq!(elements, [ + Vec::from_iter(["row1_1", "row1_2", "row1_3"]), + Vec::from_iter(["row2_1", "row2_2", "row2_3", "row2_4"]), + Vec::from_iter(["row3_1", "row3_2"]) + ]); + + let value = eval_v1_expr(&mut env, V1::Two, "read_tsv('bar.tsv', true)").unwrap(); + let elements = value + .as_array() + .unwrap() + .elements() + .iter() + .map(|v| { + v.as_object() + .unwrap() + .members() + .iter() + .map(|(k, v)| (k.as_str(), v.as_string().unwrap().as_str())) + .collect::>() + }) + .collect::>(); + assert_eq!(elements, [ + Vec::from_iter([("foo", "row1_1"), ("bar", "row1_2"), ("baz", "row1_3")]), + Vec::from_iter([("foo", "row2_1"), ("bar", "row2_2"), ("baz", "row2_3")]), + Vec::from_iter([("foo", "row3_1"), ("bar", "row3_2"), ("baz", "row3_3")]), + ]); + + let value = eval_v1_expr( + &mut env, + V1::Two, + "read_tsv('bar.tsv', true, ['qux', 'jam', 'cakes'])", + ) + .unwrap(); + let elements = value + .as_array() + .unwrap() + .elements() + .iter() + .map(|v| { + v.as_object() + .unwrap() + .members() + .iter() + .map(|(k, v)| (k.as_str(), v.as_string().unwrap().as_str())) + .collect::>() + }) + .collect::>(); + assert_eq!(elements, [ + Vec::from_iter([("qux", "row1_1"), ("jam", "row1_2"), ("cakes", "row1_3")]), + Vec::from_iter([("qux", "row2_1"), ("jam", "row2_2"), ("cakes", "row2_3")]), + Vec::from_iter([("qux", "row3_1"), ("jam", "row3_2"), ("cakes", "row3_3")]), + ]); + + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "read_tsv('bar.tsv', true, ['nope'])").unwrap_err(); + assert!( + diagnostic + .message() + .contains("call to function `read_tsv` failed: line 2 in file") + ); + assert!( + diagnostic + .message() + .contains("does not have the expected number of column") + ); + + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "read_tsv('missing_column.tsv', true)").unwrap_err(); + assert!( + diagnostic + .message() + .contains("call to function `read_tsv` failed: line 3 in file") + ); + assert!( + diagnostic + .message() + .contains("does not have the expected number of column") + ); + + let value = eval_v1_expr( + &mut env, + V1::Two, + "read_tsv('baz.tsv', false, ['foo', 'bar', 'baz'])", + ) + .unwrap(); + let elements = value + .as_array() + .unwrap() + .elements() + .iter() + .map(|v| { + v.as_object() + .unwrap() + .members() + .iter() + .map(|(k, v)| (k.as_str(), v.as_string().unwrap().as_str())) + .collect::>() + }) + .collect::>(); + assert_eq!(elements, [ + Vec::from_iter([("foo", "row1_1"), ("bar", "row1_2"), ("baz", "row1_3")]), + Vec::from_iter([("foo", "row2_1"), ("bar", "row2_2"), ("baz", "row2_3")]), + Vec::from_iter([("foo", "row3_1"), ("bar", "row3_2"), ("baz", "row3_3")]), + ]); + + let diagnostic = eval_v1_expr( + &mut env, + V1::Two, + "read_tsv('missing_column.tsv', true, ['not-valid'])", + ) + .unwrap_err(); + assert_eq!( + diagnostic.message(), + "call to function `read_tsv` failed: specified name `not-valid` is not a valid WDL \ + object field name" + ); + + let diagnostic = eval_v1_expr( + &mut env, + V1::Two, + "read_tsv('missing_column.tsv', true, ['not-valid'])", + ) + .unwrap_err(); + assert_eq!( + diagnostic.message(), + "call to function `read_tsv` failed: specified name `not-valid` is not a valid WDL \ + object field name" + ); + + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "read_tsv('invalid_name.tsv', true)").unwrap_err(); + assert!( + diagnostic + .message() + .contains("call to function `read_tsv` failed: column name `invalid-name`") + ); + assert!( + diagnostic + .message() + .contains("is not a valid WDL object field name") + ); + + let diagnostic = eval_v1_expr( + &mut env, + V1::Two, + "read_tsv('duplicate_column_name.tsv', true)", + ) + .unwrap_err(); + assert!(diagnostic.message().contains( + "call to function `read_tsv` failed: duplicate column name `foo` found in file" + )); + + let diagnostic = eval_v1_expr( + &mut env, + V1::Two, + "read_tsv('bar.tsv', true, ['foo', 'bar', 'foo'])", + ) + .unwrap_err(); + assert_eq!( + diagnostic.message(), + "call to function `read_tsv` failed: duplicate column name `foo` was specified" + ); + } +} diff --git a/wdl-engine/src/stdlib/round.rs b/wdl-engine/src/stdlib/round.rs new file mode 100644 index 000000000..932029c83 --- /dev/null +++ b/wdl-engine/src/stdlib/round.rs @@ -0,0 +1,65 @@ +//! Implements the `round` function from the WDL standard library. + +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_ast::Diagnostic; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::Value; + +/// Rounds a floating point number to the nearest integer based on standard +/// rounding rules ("round half up"). +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#round +fn round(context: CallContext<'_>) -> Result { + debug_assert_eq!(context.arguments.len(), 1); + debug_assert!(context.return_type_eq(PrimitiveTypeKind::Integer)); + + let arg = context + .coerce_argument(0, PrimitiveTypeKind::Float) + .unwrap_float(); + Ok((arg.round() as i64).into()) +} + +/// Gets the function describing `round`. +pub const fn descriptor() -> Function { + Function::new(const { &[Signature::new("(Float) -> Int", round)] }) +} + +#[cfg(test)] +mod test { + use pretty_assertions::assert_eq; + use wdl_ast::version::V1; + + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + #[test] + fn round() { + let mut env = TestEnv::default(); + let value = eval_v1_expr(&mut env, V1::Zero, "round(10.5)").unwrap(); + assert_eq!(value.unwrap_integer(), 11); + + let value = eval_v1_expr(&mut env, V1::Zero, "round(10.3)").unwrap(); + assert_eq!(value.unwrap_integer(), 10); + + let value = eval_v1_expr(&mut env, V1::Zero, "round(10)").unwrap(); + assert_eq!(value.unwrap_integer(), 10); + + let value = eval_v1_expr(&mut env, V1::Zero, "round(9.9999)").unwrap(); + assert_eq!(value.unwrap_integer(), 10); + + let value = eval_v1_expr(&mut env, V1::Zero, "round(9.12345)").unwrap(); + assert_eq!(value.unwrap_integer(), 9); + + let value = eval_v1_expr(&mut env, V1::Zero, "round(0)").unwrap(); + assert_eq!(value.unwrap_integer(), 0); + + let value = eval_v1_expr(&mut env, V1::Zero, "round(-5.1)").unwrap(); + assert_eq!(value.unwrap_integer(), -5); + + let value = eval_v1_expr(&mut env, V1::Zero, "round(-5.5)").unwrap(); + assert_eq!(value.unwrap_integer(), -6); + } +} diff --git a/wdl-engine/src/stdlib/size.rs b/wdl-engine/src/stdlib/size.rs new file mode 100644 index 000000000..23f31ef11 --- /dev/null +++ b/wdl-engine/src/stdlib/size.rs @@ -0,0 +1,300 @@ +//! Implements the `size` function from the WDL standard library. + +use std::borrow::Cow; +use std::fs; +use std::path::Path; + +use anyhow::Context; +use anyhow::Result; +use anyhow::bail; +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_ast::Diagnostic; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::CompoundValue; +use crate::PrimitiveValue; +use crate::StorageUnit; +use crate::Value; +use crate::diagnostics::function_call_failed; +use crate::diagnostics::invalid_storage_unit; + +/// Determines the size of a file, directory, or the sum total sizes of the +/// files/directories contained within a compound value. The files may be +/// optional values; None values have a size of 0.0. By default, the size is +/// returned in bytes unless the optional second argument is specified with a +/// unit. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#glob +fn size(context: CallContext<'_>) -> Result { + debug_assert!(!context.arguments.is_empty() && context.arguments.len() < 3); + debug_assert!(context.return_type_eq(PrimitiveTypeKind::Float)); + + let unit = if context.arguments.len() == 2 { + let unit = context + .coerce_argument(1, PrimitiveTypeKind::String) + .unwrap_string(); + + unit.parse() + .map_err(|_| invalid_storage_unit(&unit, context.arguments[1].span))? + } else { + StorageUnit::default() + }; + + // If the first argument is a string, we need to check if it's a file or + // directory and treat it as such. + let value = if let Some(s) = context.arguments[0].value.as_string() { + let path = context.cwd().join(s.as_str()); + let metadata = path + .metadata() + .with_context(|| { + format!( + "failed to read metadata for file `{path}`", + path = path.display() + ) + }) + .map_err(|e| function_call_failed("size", format!("{e:?}"), context.call_site))?; + if metadata.is_dir() { + PrimitiveValue::Directory(s.clone()).into() + } else { + PrimitiveValue::File(s.clone()).into() + } + } else { + context.arguments[0].value.clone() + }; + + calculate_disk_size(&value, unit, context.cwd()) + .map_err(|e| function_call_failed("size", format!("{e:?}"), context.call_site)) + .map(Into::into) +} + +/// Used to calculate the disk size of a value. +/// +/// The value may be a file or a directory or a compound type containing files +/// or directories. +/// +/// The size of a directory is based on the sum of the files contained in the +/// directory. +fn calculate_disk_size(value: &Value, unit: StorageUnit, cwd: &Path) -> Result { + match value { + Value::None => Ok(0.0), + Value::Primitive(v) => primitive_disk_size(v, unit, cwd), + Value::Compound(v) => compound_disk_size(v, unit, cwd), + } +} + +/// Calculates the disk size of the given primitive value in the given unit. +fn primitive_disk_size(value: &PrimitiveValue, unit: StorageUnit, cwd: &Path) -> Result { + match value { + PrimitiveValue::File(path) => { + let path = cwd.join(path.as_str()); + let metadata = path.metadata().with_context(|| { + format!( + "failed to read metadata for file `{path}`", + path = path.display() + ) + })?; + + if !metadata.is_file() { + bail!("path `{path}` is not a file", path = path.display()); + } + + Ok(unit.convert(metadata.len())) + } + PrimitiveValue::Directory(path) => calculate_directory_size(&cwd.join(path.as_str()), unit), + _ => Ok(0.0), + } +} + +/// Calculates the disk size for a compound value in the given unit. +fn compound_disk_size(value: &CompoundValue, unit: StorageUnit, cwd: &Path) -> Result { + match value { + CompoundValue::Pair(pair) => Ok(calculate_disk_size(pair.left(), unit, cwd)? + + calculate_disk_size(pair.right(), unit, cwd)?), + CompoundValue::Array(array) => Ok(array.elements().iter().try_fold(0.0, |t, e| { + anyhow::Ok(t + calculate_disk_size(e, unit, cwd)?) + })?), + CompoundValue::Map(map) => Ok(map.elements().iter().try_fold(0.0, |t, (k, v)| { + anyhow::Ok(t + primitive_disk_size(k, unit, cwd)? + calculate_disk_size(v, unit, cwd)?) + })?), + CompoundValue::Object(object) => { + Ok(object.members().iter().try_fold(0.0, |t, (_, v)| { + anyhow::Ok(t + calculate_disk_size(v, unit, cwd)?) + })?) + } + CompoundValue::Struct(s) => Ok(s.members().iter().try_fold(0.0, |t, (_, v)| { + anyhow::Ok(t + calculate_disk_size(v, unit, cwd)?) + })?), + } +} + +/// Calculates the size of the given directory in the given unit. +fn calculate_directory_size(path: &Path, unit: StorageUnit) -> Result { + // Don't follow symlinks as a security measure + let metadata = path.symlink_metadata().with_context(|| { + format!( + "failed to read metadata for directory `{path}`", + path = path.display() + ) + })?; + + if !metadata.is_dir() { + bail!("path `{path}` is not a directory", path = path.display()); + } + + // Create a queue for processing directories + let mut queue: Vec> = Vec::new(); + queue.push(path.into()); + + // Process each directory in the queue, adding the sizes of its files + let mut size = 0.0; + while let Some(path) = queue.pop() { + for entry in fs::read_dir(&path)? { + let entry = entry.with_context(|| { + format!( + "failed to read entry of directory `{path}`", + path = path.display() + ) + })?; + + // Note: `DirEntry::metadata` doesn't follow symlinks + let metadata = entry.metadata().with_context(|| { + format!( + "failed to read metadata for file `{path}`", + path = entry.path().display() + ) + })?; + if metadata.is_dir() { + queue.push(entry.path().into()); + } else { + size += unit.convert(metadata.len()); + } + } + } + + Ok(size) +} + +/// Gets the function describing `size`. +pub const fn descriptor() -> Function { + Function::new( + const { + &[ + Signature::new("(None, ) -> Float", size), + Signature::new("(File?, ) -> Float", size), + Signature::new("(String?, ) -> Float", size), + Signature::new("(Directory?, ) -> Float", size), + Signature::new( + "(X, ) -> Float where `X`: any compound type that recursively \ + contains a `File` or `Directory`", + size, + ), + ] + }, + ) +} + +#[cfg(test)] +mod test { + use pretty_assertions::assert_eq; + use wdl_ast::version::V1; + + use crate::PrimitiveValue; + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + #[test] + fn size() { + let mut env = TestEnv::default(); + + // 10 byte file + env.write_file("foo", "0123456789"); + // 20 byte file + env.write_file("bar", "01234567890123456789"); + // 30 byte file + env.write_file("baz", "012345678901234567890123456789"); + + env.insert_name( + "file", + PrimitiveValue::new_file(env.cwd().join("bar").to_str().expect("should be UTF-8")), + ); + env.insert_name( + "dir", + PrimitiveValue::new_directory(env.cwd().to_str().expect("should be UTF-8")), + ); + + let diagnostic = eval_v1_expr(&mut env, V1::Two, "size('foo', 'invalid')").unwrap_err(); + assert_eq!( + diagnostic.message(), + "invalid storage unit `invalid`; supported units are `B`, `KB`, `K`, `MB`, `M`, `GB`, \ + `G`, `TB`, `T`, `KiB`, `Ki`, `MiB`, `Mi`, `GiB`, `Gi`, `TiB`, and `Ti`" + ); + + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "size('does-not-exist', 'B')").unwrap_err(); + assert!( + diagnostic + .message() + .starts_with("call to function `size` failed: failed to read metadata for file") + ); + + let source = format!("size('{path}', 'B')", path = env.cwd().display()); + let value = eval_v1_expr(&mut env, V1::Two, &source).unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 60.0); + + for (expected, unit) in [ + (10.0, "B"), + (0.01, "K"), + (0.01, "KB"), + (0.00001, "M"), + (0.00001, "MB"), + (0.00000001, "G"), + (0.00000001, "GB"), + (0.00000000001, "T"), + (0.00000000001, "TB"), + (0.009765625, "Ki"), + (0.009765625, "KiB"), + (0.0000095367431640625, "Mi"), + (0.0000095367431640625, "MiB"), + (0.000000009313225746154785, "Gi"), + (0.000000009313225746154785, "GiB"), + (0.000000000009094947017729282, "Ti"), + (0.000000000009094947017729282, "TiB"), + ] { + let value = eval_v1_expr(&mut env, V1::Two, &format!("size('foo', '{unit}')")).unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), expected); + } + + let value = eval_v1_expr(&mut env, V1::Two, "size(None, 'B')").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 0.0); + + let value = eval_v1_expr(&mut env, V1::Two, "size(file, 'B')").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 20.0); + + let value = eval_v1_expr(&mut env, V1::Two, "size(dir, 'B')").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 60.0); + + let value = eval_v1_expr(&mut env, V1::Two, "size((dir, dir), 'B')").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 120.0); + + let value = eval_v1_expr(&mut env, V1::Two, "size([file, file, file], 'B')").unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 60.0); + + let value = eval_v1_expr( + &mut env, + V1::Two, + "size({ 'a': file, 'b': file, 'c': file }, 'B')", + ) + .unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 60.0); + + let value = eval_v1_expr( + &mut env, + V1::Two, + "size(object { a: file, b: file, c: file }, 'B')", + ) + .unwrap(); + approx::assert_relative_eq!(value.unwrap_float(), 60.0); + } +} diff --git a/wdl-engine/src/stdlib/stderr.rs b/wdl-engine/src/stdlib/stderr.rs new file mode 100644 index 000000000..09fa8ce32 --- /dev/null +++ b/wdl-engine/src/stdlib/stderr.rs @@ -0,0 +1,71 @@ +//! Implements the `stderr` function from the WDL standard library. + +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_ast::Diagnostic; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::Value; +use crate::diagnostics::function_call_failed; + +/// Returns the value of the executed command's standard error (stderr) as a +/// File +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#stderr +fn stderr(context: CallContext<'_>) -> Result { + debug_assert!(context.arguments.is_empty()); + debug_assert!(context.return_type_eq(PrimitiveTypeKind::File)); + + match context.stderr() { + Some(stderr) => { + debug_assert!( + stderr.as_file().is_some(), + "expected the value to be a file" + ); + Ok(stderr) + } + None => Err(function_call_failed( + "stderr", + "function may only be called in a task output section", + context.call_site, + )), + } +} + +/// Gets the function describing `stderr`. +pub const fn descriptor() -> Function { + Function::new(const { &[Signature::new("() -> File", stderr)] }) +} + +#[cfg(test)] +mod test { + use pretty_assertions::assert_eq; + use wdl_ast::version::V1; + + use crate::PrimitiveValue; + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + use crate::v1::test::eval_v1_expr_with_stdio; + + #[test] + fn stderr() { + let mut env = TestEnv::default(); + let diagnostic = eval_v1_expr(&mut env, V1::Two, "stderr()").unwrap_err(); + assert_eq!( + diagnostic.message(), + "call to function `stderr` failed: function may only be called in a task output \ + section" + ); + + let value = eval_v1_expr_with_stdio( + &mut env, + V1::Zero, + "stderr()", + PrimitiveValue::new_file("stdout.txt"), + PrimitiveValue::new_file("stderr.txt"), + ) + .unwrap(); + assert_eq!(value.unwrap_file().as_str(), "stderr.txt"); + } +} diff --git a/wdl-engine/src/stdlib/stdout.rs b/wdl-engine/src/stdlib/stdout.rs new file mode 100644 index 000000000..27afc403a --- /dev/null +++ b/wdl-engine/src/stdlib/stdout.rs @@ -0,0 +1,71 @@ +//! Implements the `stdout` function from the WDL standard library. + +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_ast::Diagnostic; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::Value; +use crate::diagnostics::function_call_failed; + +/// Returns the value of the executed command's standard output (stdout) as a +/// File. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#stdout +fn stdout(context: CallContext<'_>) -> Result { + debug_assert!(context.arguments.is_empty()); + debug_assert!(context.return_type_eq(PrimitiveTypeKind::File)); + + match context.stdout() { + Some(stdout) => { + debug_assert!( + stdout.as_file().is_some(), + "expected the value to be a file" + ); + Ok(stdout) + } + None => Err(function_call_failed( + "stdout", + "function may only be called in a task output section", + context.call_site, + )), + } +} + +/// Gets the function describing `stdout`. +pub const fn descriptor() -> Function { + Function::new(const { &[Signature::new("() -> File", stdout)] }) +} + +#[cfg(test)] +mod test { + use pretty_assertions::assert_eq; + use wdl_ast::version::V1; + + use crate::PrimitiveValue; + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + use crate::v1::test::eval_v1_expr_with_stdio; + + #[test] + fn stdout() { + let mut env = TestEnv::default(); + let diagnostic = eval_v1_expr(&mut env, V1::Two, "stdout()").unwrap_err(); + assert_eq!( + diagnostic.message(), + "call to function `stdout` failed: function may only be called in a task output \ + section" + ); + + let value = eval_v1_expr_with_stdio( + &mut env, + V1::Zero, + "stdout()", + PrimitiveValue::new_file("stdout.txt"), + PrimitiveValue::new_file("stderr.txt"), + ) + .unwrap(); + assert_eq!(value.unwrap_file().as_str(), "stdout.txt"); + } +} diff --git a/wdl-engine/src/stdlib/sub.rs b/wdl-engine/src/stdlib/sub.rs new file mode 100644 index 000000000..d19049d45 --- /dev/null +++ b/wdl-engine/src/stdlib/sub.rs @@ -0,0 +1,83 @@ +//! Implements the `sub` function from the WDL standard library. + +use std::borrow::Cow; + +use regex::Regex; +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_ast::Diagnostic; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::PrimitiveValue; +use crate::Value; +use crate::diagnostics::invalid_regex; + +/// Given three String parameters `input`, `pattern`, and `replace`, this +/// function replaces all non-overlapping occurrences of `pattern` in `input` +/// with `replace`. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#sub +fn sub(context: CallContext<'_>) -> Result { + debug_assert_eq!(context.arguments.len(), 3); + debug_assert!(context.return_type_eq(PrimitiveTypeKind::String)); + + let input = context + .coerce_argument(0, PrimitiveTypeKind::String) + .unwrap_string(); + let pattern = context + .coerce_argument(1, PrimitiveTypeKind::String) + .unwrap_string(); + let replacement = context + .coerce_argument(2, PrimitiveTypeKind::String) + .unwrap_string(); + + let regex = + Regex::new(pattern.as_str()).map_err(|e| invalid_regex(&e, context.arguments[1].span))?; + match regex.replace(input.as_str(), replacement.as_str()) { + Cow::Borrowed(_) => { + // No replacements, just return the input + Ok(PrimitiveValue::String(input).into()) + } + Cow::Owned(s) => { + // A replacement occurred, allocate a new string + Ok(PrimitiveValue::new_string(s).into()) + } + } +} + +/// Gets the function describing `sub`. +pub const fn descriptor() -> Function { + Function::new(const { &[Signature::new("(String, String, String) -> String", sub)] }) +} + +#[cfg(test)] +mod test { + use pretty_assertions::assert_eq; + use wdl_ast::version::V1; + + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + #[test] + fn sub() { + let mut env = TestEnv::default(); + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "sub('foo bar baz', '?', 'nope')").unwrap_err(); + assert_eq!( + diagnostic.message(), + "regex parse error:\n ?\n ^\nerror: repetition operator missing expression" + ); + + let value = + eval_v1_expr(&mut env, V1::Two, "sub('hello world', 'e..o', 'ey there')").unwrap(); + assert_eq!(value.unwrap_string().as_str(), "hey there world"); + + let value = + eval_v1_expr(&mut env, V1::Two, "sub('hello world', 'goodbye', 'nope')").unwrap(); + assert_eq!(value.unwrap_string().as_str(), "hello world"); + + let value = eval_v1_expr(&mut env, V1::Two, "sub('hello\tBob', '\\t', ' ')").unwrap(); + assert_eq!(value.unwrap_string().as_str(), "hello Bob"); + } +} diff --git a/wdl-engine/src/stdlib/write_json.rs b/wdl-engine/src/stdlib/write_json.rs new file mode 100644 index 000000000..5a3c14e41 --- /dev/null +++ b/wdl-engine/src/stdlib/write_json.rs @@ -0,0 +1,247 @@ +//! Implements the `write_json` function from the WDL standard library. + +use std::io::BufWriter; +use std::path::Path; + +use tempfile::NamedTempFile; +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_ast::Diagnostic; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::PrimitiveValue; +use crate::Value; +use crate::diagnostics::function_call_failed; + +/// Writes a JSON file with the serialized form of a WDL value. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#write_json +fn write_json(context: CallContext<'_>) -> Result { + debug_assert!(context.arguments.len() == 1); + debug_assert!(context.return_type_eq(PrimitiveTypeKind::File)); + + // Helper for handling errors while writing to the file. + let write_error = |e: std::io::Error| { + function_call_failed( + "write_json", + format!("failed to write to temporary file: {e}"), + context.call_site, + ) + }; + + // Create a temporary file that will be persisted after writing the lines + let mut file = NamedTempFile::new_in(context.tmp()).map_err(|e| { + function_call_failed( + "write_json", + format!("failed to create temporary file: {e}"), + context.call_site, + ) + })?; + + // Serialize the value + let mut writer = BufWriter::new(file.as_file_mut()); + let mut serializer = serde_json::Serializer::pretty(&mut writer); + context.arguments[0] + .value + .serialize(context.types(), &mut serializer) + .map_err(|e| { + function_call_failed( + "write_json", + format!("failed to serialize value: {e}"), + context.call_site, + ) + })?; + + // Consume the writer, flushing the buffer to disk. + writer + .into_inner() + .map_err(|e| write_error(e.into_error()))?; + + let (_, path) = file.keep().map_err(|e| { + function_call_failed( + "write_json", + format!("failed to keep temporary file: {e}"), + context.call_site, + ) + })?; + + Ok( + PrimitiveValue::new_file(path.into_os_string().into_string().map_err(|path| { + function_call_failed( + "write_json", + format!( + "path `{path}` cannot be represented as UTF-8", + path = Path::new(&path).display() + ), + context.call_site, + ) + })?) + .into(), + ) +} + +/// Gets the function describing `write_json`. +pub const fn descriptor() -> Function { + Function::new( + const { + &[Signature::new( + "(X) -> File where `X`: any JSON-serializable type", + write_json, + )] + }, + ) +} + +#[cfg(test)] +mod test { + use std::fs; + + use pretty_assertions::assert_eq; + use wdl_analysis::types::PrimitiveTypeKind; + use wdl_analysis::types::StructType; + use wdl_ast::version::V1; + + use crate::PrimitiveValue; + use crate::Value; + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + fn assert_file_in_temp(env: &TestEnv, value: &Value) { + assert!( + value + .as_file() + .expect("should be file") + .as_str() + .starts_with(env.tmp().to_str().expect("should be UTF-8")), + "file should be in temp directory" + ); + } + + #[test] + fn write_json() { + let mut env = TestEnv::default(); + + let ty = env.types_mut().add_struct(StructType::new("Foo", [ + ("foo", PrimitiveTypeKind::Integer), + ("bar", PrimitiveTypeKind::String), + ("baz", PrimitiveTypeKind::Float), + ])); + env.insert_struct("Foo", ty); + env.insert_name("foo", PrimitiveValue::new_file("foo")); + env.insert_name("bar", PrimitiveValue::new_file("bar")); + + let value = eval_v1_expr(&mut env, V1::Two, "write_json(None)").unwrap(); + assert_file_in_temp(&env, &value); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "null", + ); + + let value = eval_v1_expr(&mut env, V1::Two, "write_json(true)").unwrap(); + assert_file_in_temp(&env, &value); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "true", + ); + + let value = eval_v1_expr(&mut env, V1::Two, "write_json(false)").unwrap(); + assert_file_in_temp(&env, &value); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "false", + ); + + let value = eval_v1_expr(&mut env, V1::Two, "write_json(12345)").unwrap(); + assert_file_in_temp(&env, &value); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "12345", + ); + + let value = eval_v1_expr(&mut env, V1::Two, "write_json(12345.6789)").unwrap(); + assert_file_in_temp(&env, &value); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "12345.6789", + ); + + let value = eval_v1_expr(&mut env, V1::Two, "write_json('hello world!')").unwrap(); + assert_file_in_temp(&env, &value); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + r#""hello world!""#, + ); + + let value = eval_v1_expr(&mut env, V1::Two, "write_json(foo)").unwrap(); + assert_file_in_temp(&env, &value); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + r#""foo""#, + ); + + let value = eval_v1_expr(&mut env, V1::Two, "write_json(bar)").unwrap(); + assert_file_in_temp(&env, &value); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + r#""bar""#, + ); + + let value = eval_v1_expr(&mut env, V1::Two, "write_json([])").unwrap(); + assert_file_in_temp(&env, &value); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "[]", + ); + + let value = eval_v1_expr(&mut env, V1::Two, "write_json([1, 2, 3])").unwrap(); + assert_file_in_temp(&env, &value); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "[\n 1,\n 2,\n 3\n]", + ); + + let value = eval_v1_expr(&mut env, V1::Two, "write_json({})").unwrap(); + assert_file_in_temp(&env, &value); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "{}", + ); + + let value = eval_v1_expr( + &mut env, + V1::Two, + "write_json({'foo': 'bar', 'baz': 'qux'})", + ) + .unwrap(); + assert_file_in_temp(&env, &value); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "{\n \"foo\": \"bar\",\n \"baz\": \"qux\"\n}", + ); + + let value = eval_v1_expr( + &mut env, + V1::Two, + "write_json(object { foo: 1, bar: 'baz', baz: 1.9 })", + ) + .unwrap(); + assert_file_in_temp(&env, &value); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "{\n \"foo\": 1,\n \"bar\": \"baz\",\n \"baz\": 1.9\n}", + ); + + let value = eval_v1_expr( + &mut env, + V1::Two, + "write_json(Foo { foo: 1, bar: 'baz', baz: 1.9 })", + ) + .unwrap(); + assert_file_in_temp(&env, &value); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "{\n \"foo\": 1,\n \"bar\": \"baz\",\n \"baz\": 1.9\n}", + ); + } +} diff --git a/wdl-engine/src/stdlib/write_lines.rs b/wdl-engine/src/stdlib/write_lines.rs new file mode 100644 index 000000000..d2cde6eaf --- /dev/null +++ b/wdl-engine/src/stdlib/write_lines.rs @@ -0,0 +1,142 @@ +//! Implements the `write_lines` function from the WDL standard library. + +use std::io::BufWriter; +use std::io::Write; +use std::path::Path; + +use tempfile::NamedTempFile; +use wdl_analysis::stdlib::STDLIB as ANALYSIS_STDLIB; +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_ast::Diagnostic; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::PrimitiveValue; +use crate::Value; +use crate::diagnostics::function_call_failed; + +/// Writes a file with one line for each element in a Array[String]. +/// +/// All lines are terminated by the newline (\n) character (following the POSIX +/// standard). +/// +/// If the Array is empty, an empty file is written. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#write_lines +fn write_lines(context: CallContext<'_>) -> Result { + debug_assert!(context.arguments.len() == 1); + debug_assert!(context.return_type_eq(PrimitiveTypeKind::File)); + + // Helper for handling errors while writing to the file. + let write_error = |e: std::io::Error| { + function_call_failed( + "write_lines", + format!("failed to write to temporary file: {e}"), + context.call_site, + ) + }; + + let lines = context + .coerce_argument(0, ANALYSIS_STDLIB.array_string_type()) + .unwrap_array(); + + // Create a temporary file that will be persisted after writing the lines + let mut file = NamedTempFile::new_in(context.tmp()).map_err(|e| { + function_call_failed( + "write_lines", + format!("failed to create temporary file: {e}"), + context.call_site, + ) + })?; + + // Write the lines + let mut writer = BufWriter::new(file.as_file_mut()); + for line in lines.elements() { + writer + .write(line.as_string().unwrap().as_bytes()) + .map_err(write_error)?; + writeln!(&mut writer).map_err(write_error)?; + } + + // Consume the writer, flushing the buffer to disk. + writer + .into_inner() + .map_err(|e| write_error(e.into_error()))?; + + let (_, path) = file.keep().map_err(|e| { + function_call_failed( + "write_lines", + format!("failed to keep temporary file: {e}"), + context.call_site, + ) + })?; + + Ok( + PrimitiveValue::new_file(path.into_os_string().into_string().map_err(|path| { + function_call_failed( + "write_lines", + format!( + "path `{path}` cannot be represented as UTF-8", + path = Path::new(&path).display() + ), + context.call_site, + ) + })?) + .into(), + ) +} + +/// Gets the function describing `write_lines`. +pub const fn descriptor() -> Function { + Function::new(const { &[Signature::new("(Array[String]) -> File", write_lines)] }) +} + +#[cfg(test)] +mod test { + use std::fs; + + use pretty_assertions::assert_eq; + use wdl_ast::version::V1; + + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + #[test] + fn write_lines() { + let mut env = TestEnv::default(); + + let value = eval_v1_expr(&mut env, V1::Two, "write_lines([])").unwrap(); + assert!( + value + .as_file() + .expect("should be file") + .as_str() + .starts_with(env.tmp().to_str().expect("should be UTF-8")), + "file should be in temp directory" + ); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "", + ); + + let value = eval_v1_expr( + &mut env, + V1::Two, + "write_lines(['hello', 'world', '!\n', '!'])", + ) + .unwrap(); + assert!( + value + .as_file() + .expect("should be file") + .as_str() + .starts_with(env.tmp().to_str().expect("should be UTF-8")), + "file should be in temp directory" + ); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "hello\nworld\n!\n\n!\n" + ); + } +} diff --git a/wdl-engine/src/stdlib/write_map.rs b/wdl-engine/src/stdlib/write_map.rs new file mode 100644 index 000000000..4edbb7efe --- /dev/null +++ b/wdl-engine/src/stdlib/write_map.rs @@ -0,0 +1,148 @@ +//! Implements the `write_map` function from the WDL standard library. + +use std::io::BufWriter; +use std::io::Write; +use std::path::Path; + +use tempfile::NamedTempFile; +use wdl_analysis::stdlib::STDLIB as ANALYSIS_STDLIB; +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_ast::Diagnostic; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::PrimitiveValue; +use crate::Value; +use crate::diagnostics::function_call_failed; + +/// Writes a tab-separated value (TSV) file with one line for each element in a +/// Map[String, String]. +/// +/// Each element is concatenated into a single tab-delimited string of the +/// format ~{key}\t~{value}. +/// +/// Each line is terminated by the newline (\n) character. +/// +/// If the Map is empty, an empty file is written. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#write_map +fn write_map(context: CallContext<'_>) -> Result { + debug_assert!(context.arguments.len() == 1); + debug_assert!(context.return_type_eq(PrimitiveTypeKind::File)); + + // Helper for handling errors while writing to the file. + let write_error = |e: std::io::Error| { + function_call_failed( + "write_map", + format!("failed to write to temporary file: {e}"), + context.call_site, + ) + }; + + let map = context + .coerce_argument(0, ANALYSIS_STDLIB.map_string_string_type()) + .unwrap_map(); + + // Create a temporary file that will be persisted after writing the map + let mut file = NamedTempFile::new_in(context.tmp()).map_err(|e| { + function_call_failed( + "write_map", + format!("failed to create temporary file: {e}"), + context.call_site, + ) + })?; + + // Write the lines + let mut writer = BufWriter::new(file.as_file_mut()); + for (key, value) in map.elements() { + writeln!( + &mut writer, + "{key}\t{value}", + key = key.as_string().unwrap(), + value = value.as_string().unwrap() + ) + .map_err(write_error)?; + } + + // Consume the writer, flushing the buffer to disk. + writer + .into_inner() + .map_err(|e| write_error(e.into_error()))?; + + let (_, path) = file.keep().map_err(|e| { + function_call_failed( + "write_map", + format!("failed to keep temporary file: {e}"), + context.call_site, + ) + })?; + + Ok( + PrimitiveValue::new_file(path.into_os_string().into_string().map_err(|path| { + function_call_failed( + "write_map", + format!( + "path `{path}` cannot be represented as UTF-8", + path = Path::new(&path).display() + ), + context.call_site, + ) + })?) + .into(), + ) +} + +/// Gets the function describing `write_map`. +pub const fn descriptor() -> Function { + Function::new(const { &[Signature::new("(Map[String, String]) -> File", write_map)] }) +} + +#[cfg(test)] +mod test { + use std::fs; + + use pretty_assertions::assert_eq; + use wdl_ast::version::V1; + + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + #[test] + fn write_map() { + let mut env = TestEnv::default(); + + let value = eval_v1_expr(&mut env, V1::Two, "write_map({})").unwrap(); + assert!( + value + .as_file() + .expect("should be file") + .as_str() + .starts_with(env.tmp().to_str().expect("should be UTF-8")), + "file should be in temp directory" + ); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "", + ); + + let value = eval_v1_expr( + &mut env, + V1::Two, + "write_map({ 'foo': 'bar', 'bar': 'baz', 'qux': 'jam' })", + ) + .unwrap(); + assert!( + value + .as_file() + .expect("should be file") + .as_str() + .starts_with(env.tmp().to_str().expect("should be UTF-8")), + "file should be in temp directory" + ); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "foo\tbar\nbar\tbaz\nqux\tjam\n", + ); + } +} diff --git a/wdl-engine/src/stdlib/write_object.rs b/wdl-engine/src/stdlib/write_object.rs new file mode 100644 index 000000000..810300f71 --- /dev/null +++ b/wdl-engine/src/stdlib/write_object.rs @@ -0,0 +1,230 @@ +//! Implements the `write_object` function from the WDL standard library. + +use std::io::BufWriter; +use std::io::Write; +use std::path::Path; + +use tempfile::NamedTempFile; +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_analysis::types::Type; +use wdl_ast::Diagnostic; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::PrimitiveValue; +use crate::Value; +use crate::diagnostics::function_call_failed; +use crate::stdlib::write_tsv::write_tsv_value; + +/// Writes a tab-separated value (TSV) file with the contents of a Object or +/// Struct. +/// +/// The file contains two tab-delimited lines. +/// +/// The first line is the names of the members, and the second line is the +/// corresponding values. +/// +/// Each line is terminated by the newline (\n) character. The ordering of the +/// columns is unspecified. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#write_object +fn write_object(context: CallContext<'_>) -> Result { + debug_assert!(context.arguments.len() == 1); + debug_assert!(context.return_type_eq(PrimitiveTypeKind::File)); + + // Helper for handling errors while writing to the file. + let write_error = |e: std::io::Error| { + function_call_failed( + "write_object", + format!("failed to write to temporary file: {e}"), + context.call_site, + ) + }; + + let object = context.coerce_argument(0, Type::Object).unwrap_object(); + + // Create a temporary file that will be persisted after writing the map + let mut file = NamedTempFile::new_in(context.tmp()).map_err(|e| { + function_call_failed( + "write_object", + format!("failed to create temporary file: {e}"), + context.call_site, + ) + })?; + + let mut writer = BufWriter::new(file.as_file_mut()); + if !object.members().is_empty() { + // Write the header first + for (i, key) in object.members().keys().enumerate() { + if i > 0 { + writer.write(b"\t").map_err(write_error)?; + } + + writer.write(key.as_bytes()).map_err(write_error)?; + } + + writeln!(&mut writer).map_err(write_error)?; + + for (i, (key, value)) in object.members().iter().enumerate() { + if i > 0 { + writer.write(b"\t").map_err(write_error)?; + } + + match value { + Value::Primitive(v) => { + if !write_tsv_value(&mut writer, v).map_err(write_error)? { + return Err(function_call_failed( + "write_object", + format!("member `{key}` contains a tab character"), + context.call_site, + )); + } + } + _ => { + return Err(function_call_failed( + "write_object", + format!("member `{key}` is not a primitive value"), + context.call_site, + )); + } + } + } + + writeln!(&mut writer).map_err(write_error)?; + } + + // Consume the writer, flushing the buffer to disk. + writer + .into_inner() + .map_err(|e| write_error(e.into_error()))?; + + let (_, path) = file.keep().map_err(|e| { + function_call_failed( + "write_object", + format!("failed to keep temporary file: {e}"), + context.call_site, + ) + })?; + + Ok( + PrimitiveValue::new_file(path.into_os_string().into_string().map_err(|path| { + function_call_failed( + "write_object", + format!( + "path `{path}` cannot be represented as UTF-8", + path = Path::new(&path).display() + ), + context.call_site, + ) + })?) + .into(), + ) +} + +/// Gets the function describing `write_object`. +pub const fn descriptor() -> Function { + Function::new( + const { + &[ + Signature::new("(Object) -> File", write_object), + Signature::new( + "(S) -> File where `S`: any structure containing only primitive types", + write_object, + ), + ] + }, + ) +} + +#[cfg(test)] +mod test { + use std::fs; + + use pretty_assertions::assert_eq; + use wdl_analysis::types::PrimitiveTypeKind; + use wdl_analysis::types::StructType; + use wdl_ast::version::V1; + + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + #[test] + fn write_object() { + let mut env = TestEnv::default(); + + let ty = env.types_mut().add_struct(StructType::new("Foo", [ + ("foo", PrimitiveTypeKind::Integer), + ("bar", PrimitiveTypeKind::String), + ("baz", PrimitiveTypeKind::Boolean), + ])); + + env.insert_struct("Foo", ty); + + let value = eval_v1_expr(&mut env, V1::Two, "write_object(object {})").unwrap(); + assert!( + value + .as_file() + .expect("should be file") + .as_str() + .starts_with(env.tmp().to_str().expect("should be UTF-8")), + "file should be in temp directory" + ); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "", + ); + + let value = eval_v1_expr( + &mut env, + V1::Two, + "write_object(object { foo: 'bar', bar: 1, baz: 3.5 })", + ) + .unwrap(); + assert!( + value + .as_file() + .expect("should be file") + .as_str() + .starts_with(env.tmp().to_str().expect("should be UTF-8")), + "file should be in temp directory" + ); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "foo\tbar\tbaz\nbar\t1\t3.5\n", + ); + + let value = eval_v1_expr( + &mut env, + V1::Two, + "write_object(Foo { foo: 1, bar: 'foo', baz: true })", + ) + .unwrap(); + assert!( + value + .as_file() + .expect("should be file") + .as_str() + .starts_with(env.tmp().to_str().expect("should be UTF-8")), + "file should be in temp directory" + ); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "foo\tbar\tbaz\n1\tfoo\ttrue\n", + ); + + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "write_object(object { foo: [] })").unwrap_err(); + assert_eq!( + diagnostic.message(), + "call to function `write_object` failed: member `foo` is not a primitive value" + ); + + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "write_object(object { foo: '\tbar' })").unwrap_err(); + assert_eq!( + diagnostic.message(), + "call to function `write_object` failed: member `foo` contains a tab character" + ); + } +} diff --git a/wdl-engine/src/stdlib/write_objects.rs b/wdl-engine/src/stdlib/write_objects.rs new file mode 100644 index 000000000..20a38577d --- /dev/null +++ b/wdl-engine/src/stdlib/write_objects.rs @@ -0,0 +1,314 @@ +//! Implements the `write_objects` function from the WDL standard library. + +use std::io::BufWriter; +use std::io::Write; +use std::path::Path; + +use tempfile::NamedTempFile; +use wdl_analysis::types::CompoundTypeDef; +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_analysis::types::Type; +use wdl_ast::Diagnostic; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::CompoundValue; +use crate::Object; +use crate::PrimitiveValue; +use crate::Struct; +use crate::Value; +use crate::diagnostics::function_call_failed; +use crate::stdlib::write_tsv::write_tsv_value; + +/// Writes a tab-separated value (TSV) file with the contents of a Array[Struct] +/// or Array[Object]. +/// +/// All elements of the Array must have the same member names, or an error is +/// raised. +/// +/// The file contains N+1 tab-delimited lines, where N is the number of elements +/// in the Array. The first line is the names of the Struct/Object members, and +/// the subsequent lines are the corresponding values for each element. Each +/// line is terminated by a newline (\n) character. The lines are written in the +/// same order as the elements in the Array. The ordering of the columns is the +/// same as the order in which the Struct's members are defined; the column +/// ordering for Objects is unspecified. If the Array is empty, an empty file is +/// written. +/// +/// The member values must be serializable to strings, meaning that only +/// primitive types are supported. Attempting to write a Struct or Object that +/// has a compound member value results in an error. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#write_objects +fn write_objects(context: CallContext<'_>) -> Result { + debug_assert!(context.arguments.len() == 1); + debug_assert!(context.return_type_eq(PrimitiveTypeKind::File)); + + // Helper for handling errors while writing to the file. + let write_error = |e: std::io::Error| { + function_call_failed( + "write_objects", + format!("failed to write to temporary file: {e}"), + context.call_site, + ) + }; + + let array = context.arguments[0] + .value + .as_array() + .expect("argument should be an array"); + + // Create a temporary file that will be persisted after writing the map + let mut file = NamedTempFile::new_in(context.tmp()).map_err(|e| { + function_call_failed( + "write_objects", + format!("failed to create temporary file: {e}"), + context.call_site, + ) + })?; + + let element_type = match context.arguments[0].value.ty() { + Type::Compound(ty) => match context.types().type_definition(ty.definition()) { + CompoundTypeDef::Array(ty) => ty.element_type(), + _ => panic!("expected an array type for the argument"), + }, + _ => panic!("expected a compound type for the argument"), + }; + + // If it's an array of objects, we need to ensure each object has the exact same + // member names + let mut empty = array.elements().is_empty(); + if matches!(element_type, Type::Object) { + let mut iter = array.elements().iter(); + let expected = iter + .next() + .expect("should be non-empty") + .as_object() + .expect("should be object") + .members(); + + empty = expected.is_empty(); + for v in iter { + let next = v + .as_object() + .expect("element should be an object") + .members(); + if next.len() != expected.len() || next.keys().any(|k| !expected.contains_key(k)) { + return Err(function_call_failed( + "write_objects", + "expected every object to have the same member names", + context.call_site, + )); + } + } + } + + let mut writer = BufWriter::new(file.as_file_mut()); + if !empty { + // Write the header first + let keys = match array.elements().first().expect("array should not be empty") { + Value::Compound(CompoundValue::Object(Object { members, .. })) + | Value::Compound(CompoundValue::Struct(Struct { members, .. })) => members.keys(), + _ => unreachable!("value should either be an object or struct"), + }; + + for (i, key) in keys.enumerate() { + if i > 0 { + writer.write(b"\t").map_err(write_error)?; + } + + writer.write(key.as_bytes()).map_err(write_error)?; + } + + writeln!(&mut writer).map_err(write_error)?; + + // Next, write a row for each object/struct + for v in array.elements().iter() { + let members = match v { + Value::Compound(CompoundValue::Object(Object { members, .. })) + | Value::Compound(CompoundValue::Struct(Struct { members, .. })) => members, + _ => unreachable!("value should either be an object or struct"), + }; + + for (i, (k, v)) in members.iter().enumerate() { + if i > 0 { + writer.write(b"\t").map_err(write_error)?; + } + + match v { + Value::Primitive(v) => { + if !write_tsv_value(&mut writer, v).map_err(write_error)? { + return Err(function_call_failed( + "write_objects", + format!("member `{k}` contains a tab character"), + context.call_site, + )); + } + } + _ => { + return Err(function_call_failed( + "write_objects", + format!("member `{k}` is not a primitive value"), + context.call_site, + )); + } + } + } + + writeln!(&mut writer).map_err(write_error)?; + } + } + + // Consume the writer, flushing the buffer to disk. + writer + .into_inner() + .map_err(|e| write_error(e.into_error()))?; + + let (_, path) = file.keep().map_err(|e| { + function_call_failed( + "write_objects", + format!("failed to keep temporary file: {e}"), + context.call_site, + ) + })?; + + Ok( + PrimitiveValue::new_file(path.into_os_string().into_string().map_err(|path| { + function_call_failed( + "write_objects", + format!( + "path `{path}` cannot be represented as UTF-8", + path = Path::new(&path).display() + ), + context.call_site, + ) + })?) + .into(), + ) +} + +/// Gets the function describing `write_objects`. +pub const fn descriptor() -> Function { + Function::new( + const { + &[ + Signature::new("(Array[Object]) -> File", write_objects), + Signature::new( + "(Array[S]) -> File where `S`: any structure containing only primitive types", + write_objects, + ), + ] + }, + ) +} + +#[cfg(test)] +mod test { + use std::fs; + + use pretty_assertions::assert_eq; + use wdl_analysis::types::PrimitiveTypeKind; + use wdl_analysis::types::StructType; + use wdl_ast::version::V1; + + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + #[test] + fn write_objects() { + let mut env = TestEnv::default(); + + let ty = env.types_mut().add_struct(StructType::new("Foo", [ + ("foo", PrimitiveTypeKind::Integer), + ("bar", PrimitiveTypeKind::String), + ("baz", PrimitiveTypeKind::Boolean), + ])); + + env.insert_struct("Foo", ty); + + let value = eval_v1_expr(&mut env, V1::Two, "write_objects([object {}])").unwrap(); + assert!( + value + .as_file() + .expect("should be file") + .as_str() + .starts_with(env.tmp().to_str().expect("should be UTF-8")), + "file should be in temp directory" + ); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "", + ); + + let value = eval_v1_expr( + &mut env, + V1::Two, + "write_objects([object { foo: 'bar', bar: 1, baz: 3.5 }, object { foo: 'foo', bar: \ + 101, baz: 1234 }, ])", + ) + .unwrap(); + assert!( + value + .as_file() + .expect("should be file") + .as_str() + .starts_with(env.tmp().to_str().expect("should be UTF-8")), + "file should be in temp directory" + ); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "foo\tbar\tbaz\nbar\t1\t3.5\nfoo\t101\t1234\n", + ); + + let value = eval_v1_expr( + &mut env, + V1::Two, + "write_objects([Foo { foo: 1, bar: 'foo', baz: true }, Foo { foo: -10, bar: 'bar', \ + baz: false }])", + ) + .unwrap(); + assert!( + value + .as_file() + .expect("should be file") + .as_str() + .starts_with(env.tmp().to_str().expect("should be UTF-8")), + "file should be in temp directory" + ); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "foo\tbar\tbaz\n1\tfoo\ttrue\n-10\tbar\tfalse\n", + ); + + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "write_objects([object { foo: [] }])").unwrap_err(); + assert_eq!( + diagnostic.message(), + "call to function `write_objects` failed: member `foo` is not a primitive value" + ); + + let diagnostic = eval_v1_expr( + &mut env, + V1::Two, + "write_objects([object { foo: '\tbar' }])", + ) + .unwrap_err(); + assert_eq!( + diagnostic.message(), + "call to function `write_objects` failed: member `foo` contains a tab character" + ); + + let diagnostic = eval_v1_expr( + &mut env, + V1::Two, + "write_objects([object { foo: 1 }, object { bar: 2 }])", + ) + .unwrap_err(); + assert_eq!( + diagnostic.message(), + "call to function `write_objects` failed: expected every object to have the same \ + member names" + ); + } +} diff --git a/wdl-engine/src/stdlib/write_tsv.rs b/wdl-engine/src/stdlib/write_tsv.rs new file mode 100644 index 000000000..68c5b1fd2 --- /dev/null +++ b/wdl-engine/src/stdlib/write_tsv.rs @@ -0,0 +1,644 @@ +//! Implements the `write_tsv` function from the WDL standard library. + +use std::io::BufWriter; +use std::io::Write; +use std::path::Path; + +use tempfile::NamedTempFile; +use wdl_analysis::stdlib::STDLIB as ANALYSIS_STDLIB; +use wdl_analysis::types::CompoundTypeDef; +use wdl_analysis::types::PrimitiveTypeKind; +use wdl_ast::Diagnostic; +use wdl_ast::Span; + +use super::CallContext; +use super::Function; +use super::Signature; +use crate::Array; +use crate::PrimitiveValue; +use crate::Value; +use crate::diagnostics::function_call_failed; + +/// Writes a primitive value as a TSV value. +/// +/// Returns `Ok(true)` if the value was written. +/// +/// Returns `Ok(false)` if the value contains a tab character. +/// +/// Returns `Err(_)` if there was an I/O error. +pub(crate) fn write_tsv_value( + mut writer: &mut W, + value: &PrimitiveValue, +) -> Result { + match value { + PrimitiveValue::Boolean(v) => { + write!(&mut writer, "{v}")?; + } + PrimitiveValue::Integer(v) => { + write!(&mut writer, "{v}")?; + } + PrimitiveValue::Float(v) => { + write!(&mut writer, "{v}")?; + } + PrimitiveValue::String(v) | PrimitiveValue::File(v) | PrimitiveValue::Directory(v) => { + if v.contains('\t') { + return Ok(false); + } + + write!(&mut writer, "{v}")?; + } + } + + Ok(true) +} + +/// Helper for writing a `Array[Array[String]]` to a TSV file. +fn write_array_tsv_file( + tmp: &Path, + rows: Array, + header: Option, + call_site: Span, +) -> Result { + // Helper for handling errors while writing to the file. + let write_error = |e: std::io::Error| { + function_call_failed( + "write_tsv", + format!("failed to write to temporary file: {e}"), + call_site, + ) + }; + + // Create a temporary file that will be persisted after writing + let mut file = NamedTempFile::new_in(tmp).map_err(|e| { + function_call_failed( + "write_tsv", + format!("failed to create temporary file: {e}"), + call_site, + ) + })?; + + let mut writer = BufWriter::new(file.as_file_mut()); + + // Start by writing the header, if one was provided + let column_count = if let Some(header) = header { + for (i, name) in header.elements().iter().enumerate() { + let name = name.as_string().unwrap(); + if name.contains('\t') { + return Err(function_call_failed( + "write_tsv", + format!("specified column name at index {i} contains a tab character"), + call_site, + )); + } + + if i > 0 { + writer.write(b"\t").map_err(write_error)?; + } + + writer.write(name.as_bytes()).map_err(write_error)?; + } + + writeln!(&mut writer).map_err(write_error)?; + Some(header.elements().len()) + } else { + None + }; + + // Write the rows + for (index, row) in rows.elements().iter().enumerate() { + let row = row.as_array().unwrap(); + if let Some(column_count) = column_count { + if row.elements().len() != column_count { + return Err(function_call_failed( + "write_tsv", + format!( + "expected {column_count} column{s1} for every row but array at index \ + {index} has length {len}", + s1 = if column_count == 1 { "s" } else { "" }, + len = row.elements().len(), + ), + call_site, + )); + } + } + + for (i, column) in row.elements().iter().enumerate() { + let column = column.as_string().unwrap(); + if column.contains('\t') { + return Err(function_call_failed( + "write_tsv", + format!("element of array at index {index} contains a tab character"), + call_site, + )); + } + + if i > 0 { + writer.write(b"\t").map_err(write_error)?; + } + + writer.write(column.as_bytes()).map_err(write_error)?; + } + + writeln!(&mut writer).map_err(write_error)?; + } + + // Consume the writer, flushing the buffer to disk. + writer + .into_inner() + .map_err(|e| write_error(e.into_error()))?; + + let (_, path) = file.keep().map_err(|e| { + function_call_failed( + "write_tsv", + format!("failed to keep temporary file: {e}"), + call_site, + ) + })?; + + Ok( + PrimitiveValue::new_file(path.into_os_string().into_string().map_err(|path| { + function_call_failed( + "write_tsv", + format!( + "path `{path}` cannot be represented as UTF-8", + path = Path::new(&path).display() + ), + call_site, + ) + })?) + .into(), + ) +} + +/// Given an Array of elements, writes a tab-separated value (TSV) file with one +/// line for each element. +/// +/// `File write_tsv(Array[Array[String]])`: Each element is concatenated using a +/// tab ('\t') delimiter and written as a row in the file. There is no header +/// row. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#write_tsv +fn write_tsv(context: CallContext<'_>) -> Result { + debug_assert!(context.arguments.len() == 1); + debug_assert!(context.return_type_eq(PrimitiveTypeKind::File)); + + let rows = context + .coerce_argument(0, ANALYSIS_STDLIB.array_array_string_type()) + .unwrap_array(); + + write_array_tsv_file(context.tmp(), rows, None, context.call_site) +} + +/// Given an Array of elements, writes a tab-separated value (TSV) file with one +/// line for each element. +/// +/// `File write_tsv(Array[Array[String]], Boolean, Array[String])`: The second +/// argument must be true and the third argument provides an Array of column +/// names. The column names are concatenated to create a header that is written +/// as the first row of the file. All elements must be the same length as the +/// header array. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#write_tsv +fn write_tsv_with_header(context: CallContext<'_>) -> Result { + debug_assert!(context.arguments.len() == 3); + debug_assert!(context.return_type_eq(PrimitiveTypeKind::File)); + + let rows = context + .coerce_argument(0, ANALYSIS_STDLIB.array_array_string_type()) + .unwrap_array(); + let write_header = context + .coerce_argument(1, PrimitiveTypeKind::Boolean) + .unwrap_boolean(); + let header = context + .coerce_argument(2, ANALYSIS_STDLIB.array_string_type()) + .unwrap_array(); + + write_array_tsv_file( + context.tmp(), + rows, + if write_header { Some(header) } else { None }, + context.call_site, + ) +} + +/// Given an Array of elements, writes a tab-separated value (TSV) file with one +/// line for each element. +/// +/// `File write_tsv(Array[Struct], [Boolean, [Array[String]]])`: Each element is +/// a struct whose field values are concatenated in the order the fields are +/// defined. The optional second argument specifies whether to write a header +/// row. If it is true, then the header is created from the struct field names. +/// If the second argument is true, then the optional third argument may be used +/// to specify column names to use instead of the struct field names. +/// +/// https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#write_tsv +fn write_tsv_struct(context: CallContext<'_>) -> Result { + debug_assert!(!context.arguments.is_empty() && context.arguments.len() <= 3); + debug_assert!(context.return_type_eq(PrimitiveTypeKind::File)); + + // Helper for handling errors while writing to the file. + let write_error = |e: std::io::Error| { + function_call_failed( + "write_tsv", + format!("failed to write to temporary file: {e}"), + context.call_site, + ) + }; + + let rows = context.arguments[0].value.as_array().unwrap(); + let write_header = if context.arguments.len() >= 2 { + context + .coerce_argument(1, PrimitiveTypeKind::Boolean) + .unwrap_boolean() + } else { + false + }; + let header = if context.arguments.len() == 3 { + Some( + context + .coerce_argument(2, ANALYSIS_STDLIB.array_string_type()) + .unwrap_array(), + ) + } else { + None + }; + + // Create a temporary file that will be persisted after writing + let mut file = NamedTempFile::new_in(context.tmp()).map_err(|e| { + function_call_failed( + "write_tsv", + format!("failed to create temporary file: {e}"), + context.call_site, + ) + })?; + + let mut writer = BufWriter::new(file.as_file_mut()); + + // Get the struct type to print the columns; we need to do this even when the + // array is empty + let ty = match context + .types() + .type_definition(rows.ty().as_compound().unwrap().definition()) + { + CompoundTypeDef::Array(ty) => context.types().struct_type(ty.element_type()), + _ => panic!("expected an array"), + }; + + // Start by writing the header + if write_header { + if let Some(header) = header { + // Ensure the header count matches the element count + if header.elements().len() != ty.members().len() { + return Err(function_call_failed( + "write_tsv", + format!( + "expected {expected} header{s1} as the struct has {expected} member{s1}, \ + but only given {actual} header{s2}", + expected = ty.members().len(), + s1 = if ty.members().len() == 1 { "" } else { "s" }, + actual = header.elements().len(), + s2 = if header.elements().len() == 1 { + "" + } else { + "s" + }, + ), + context.arguments[2].span, + )); + } + + // Header was explicitly specified, write out the values + for (i, name) in header.elements().iter().enumerate() { + let name = name.as_string().unwrap(); + if name.contains('\t') { + return Err(function_call_failed( + "write_tsv", + format!("specified column name at index {i} contains a tab character"), + context.call_site, + )); + } + + if i > 0 { + writer.write(b"\t").map_err(write_error)?; + } + + writer.write(name.as_bytes()).map_err(write_error)?; + } + } else { + // Write out the names of each struct member + for (i, name) in ty.members().keys().enumerate() { + if i > 0 { + writer.write(b"\t").map_err(write_error)?; + } + + writer.write(name.as_bytes()).map_err(write_error)?; + } + } + + writeln!(&mut writer).map_err(write_error)?; + } + + // Write the rows + for row in rows.elements() { + let row = row.as_struct().unwrap(); + for (i, (name, column)) in row.members().iter().enumerate() { + if i > 0 { + writer.write(b"\t").map_err(write_error)?; + } + + match column { + Value::Primitive(v) => { + if !write_tsv_value(&mut writer, v).map_err(write_error)? { + return Err(function_call_failed( + "write_tsv", + format!("member `{name}` contains a tab character"), + context.call_site, + )); + } + } + _ => panic!("value is expected to be primitive"), + } + } + + writeln!(&mut writer).map_err(write_error)?; + } + + // Consume the writer, flushing the buffer to disk. + writer + .into_inner() + .map_err(|e| write_error(e.into_error()))?; + + let (_, path) = file.keep().map_err(|e| { + function_call_failed( + "write_tsv", + format!("failed to keep temporary file: {e}"), + context.call_site, + ) + })?; + + Ok( + PrimitiveValue::new_file(path.into_os_string().into_string().map_err(|path| { + function_call_failed( + "write_tsv", + format!( + "path `{path}` cannot be represented as UTF-8", + path = Path::new(&path).display() + ), + context.call_site, + ) + })?) + .into(), + ) +} + +/// Gets the function describing `write_tsv`. +pub const fn descriptor() -> Function { + Function::new( + const { + &[ + Signature::new("(Array[Array[String]]) -> File", write_tsv), + Signature::new( + "(Array[Array[String]], Boolean, Array[String]) -> File", + write_tsv_with_header, + ), + Signature::new( + "(Array[S], , ) -> File where `S`: any structure \ + containing only primitive types", + write_tsv_struct, + ), + ] + }, + ) +} + +#[cfg(test)] +mod test { + use std::fs; + + use pretty_assertions::assert_eq; + use wdl_analysis::types::PrimitiveTypeKind; + use wdl_analysis::types::StructType; + use wdl_ast::version::V1; + + use crate::v1::test::TestEnv; + use crate::v1::test::eval_v1_expr; + + #[test] + fn write_tsv() { + let mut env = TestEnv::default(); + + let ty = env.types_mut().add_struct(StructType::new("Foo", [ + ("foo", PrimitiveTypeKind::Integer), + ("bar", PrimitiveTypeKind::String), + ("baz", PrimitiveTypeKind::Boolean), + ])); + + env.insert_struct("Foo", ty); + + let value = eval_v1_expr(&mut env, V1::Two, "write_tsv([])").unwrap(); + assert!( + value + .as_file() + .expect("should be file") + .as_str() + .starts_with(env.tmp().to_str().expect("should be UTF-8")), + "file should be in temp directory" + ); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "", + ); + + let value = eval_v1_expr( + &mut env, + V1::Two, + "write_tsv([['foo'], ['foo', 'bar'], ['foo', 'bar', 'baz']])", + ) + .unwrap(); + assert!( + value + .as_file() + .expect("should be file") + .as_str() + .starts_with(env.tmp().to_str().expect("should be UTF-8")), + "file should be in temp directory" + ); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "foo\nfoo\tbar\nfoo\tbar\tbaz\n", + ); + + let value = eval_v1_expr( + &mut env, + V1::Two, + "write_tsv([], true, ['foo', 'bar', 'baz'])", + ) + .unwrap(); + assert!( + value + .as_file() + .expect("should be file") + .as_str() + .starts_with(env.tmp().to_str().expect("should be UTF-8")), + "file should be in temp directory" + ); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "foo\tbar\tbaz\n", + ); + + let diagnostic = eval_v1_expr( + &mut env, + V1::Two, + "write_tsv([['foo'], ['foo', 'bar'], ['foo', 'bar', 'baz']], true, ['foo', 'bar', \ + 'baz'])", + ) + .unwrap_err(); + assert_eq!( + diagnostic.message(), + "call to function `write_tsv` failed: expected 3 column for every row but array at \ + index 0 has length 1" + ); + + let value = eval_v1_expr( + &mut env, + V1::Two, + "write_tsv([['foo'], ['foo', 'bar'], ['foo', 'bar', 'baz']], false, ['foo', 'bar', \ + 'baz'])", + ) + .unwrap(); + assert!( + value + .as_file() + .expect("should be file") + .as_str() + .starts_with(env.tmp().to_str().expect("should be UTF-8")), + "file should be in temp directory" + ); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "foo\nfoo\tbar\nfoo\tbar\tbaz\n", + ); + + let value = eval_v1_expr( + &mut env, + V1::Two, + "write_tsv([Foo { foo: 1, bar: 'hi', baz: true }, Foo { foo: 1234, bar: 'there', baz: \ + false }])", + ) + .unwrap(); + assert!( + value + .as_file() + .expect("should be file") + .as_str() + .starts_with(env.tmp().to_str().expect("should be UTF-8")), + "file should be in temp directory" + ); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "1\thi\ttrue\n1234\tthere\tfalse\n", + ); + + let value = eval_v1_expr( + &mut env, + V1::Two, + "write_tsv([Foo { foo: 1, bar: 'hi', baz: true }, Foo { foo: 1234, bar: 'there', baz: \ + false }], false)", + ) + .unwrap(); + assert!( + value + .as_file() + .expect("should be file") + .as_str() + .starts_with(env.tmp().to_str().expect("should be UTF-8")), + "file should be in temp directory" + ); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "1\thi\ttrue\n1234\tthere\tfalse\n", + ); + + let value = eval_v1_expr( + &mut env, + V1::Two, + "write_tsv([Foo { foo: 1, bar: 'hi', baz: true }, Foo { foo: 1234, bar: 'there', baz: \ + false }], true)", + ) + .unwrap(); + assert!( + value + .as_file() + .expect("should be file") + .as_str() + .starts_with(env.tmp().to_str().expect("should be UTF-8")), + "file should be in temp directory" + ); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "foo\tbar\tbaz\n1\thi\ttrue\n1234\tthere\tfalse\n", + ); + + let value = eval_v1_expr( + &mut env, + V1::Two, + "write_tsv([Foo { foo: 1, bar: 'hi', baz: true }, Foo { foo: 1234, bar: 'there', baz: \ + false }], true, ['qux', 'jam', 'cakes'])", + ) + .unwrap(); + assert!( + value + .as_file() + .expect("should be file") + .as_str() + .starts_with(env.tmp().to_str().expect("should be UTF-8")), + "file should be in temp directory" + ); + assert_eq!( + fs::read_to_string(value.unwrap_file().as_str()).expect("failed to read file"), + "qux\tjam\tcakes\n1\thi\ttrue\n1234\tthere\tfalse\n", + ); + + let diagnostic = eval_v1_expr( + &mut env, + V1::Two, + "write_tsv([Foo { foo: 1, bar: 'hi', baz: true }, Foo { foo: 1234, bar: 'there', baz: \ + false }], true, ['qux'])", + ) + .unwrap_err(); + assert_eq!( + diagnostic.message(), + "call to function `write_tsv` failed: expected 3 headers as the struct has 3 members, \ + but only given 1 header" + ); + + let diagnostic = eval_v1_expr(&mut env, V1::Two, "write_tsv([['\tfoo']])").unwrap_err(); + assert_eq!( + diagnostic.message(), + "call to function `write_tsv` failed: element of array at index 0 contains a tab \ + character" + ); + + let diagnostic = + eval_v1_expr(&mut env, V1::Two, "write_tsv([['foo']], true, ['\tfoo'])").unwrap_err(); + assert_eq!( + diagnostic.message(), + "call to function `write_tsv` failed: specified column name at index 0 contains a tab \ + character" + ); + + let diagnostic = eval_v1_expr( + &mut env, + V1::Two, + "write_tsv([Foo { foo: 1, bar: 'hi', baz: true }, Foo { foo: 1234, bar: 'there', baz: \ + false }], true, ['foo', '\tbar', 'baz'])", + ) + .unwrap_err(); + assert_eq!( + diagnostic.message(), + "call to function `write_tsv` failed: specified column name at index 1 contains a tab \ + character" + ); + } +} diff --git a/wdl-engine/src/units.rs b/wdl-engine/src/units.rs new file mode 100644 index 000000000..b88965138 --- /dev/null +++ b/wdl-engine/src/units.rs @@ -0,0 +1,65 @@ +//! Module for unit representations. + +use std::str::FromStr; + +/// Represents a storage unit. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)] +pub enum StorageUnit { + /// The unit is in bytes. + #[default] + Bytes, + /// The unit is in kilobytes (10^3 bytes). + Kilobytes, + /// The unit is in megabytes (10^6 bytes). + Megabytes, + /// The unit is in gigabytes (10^9 bytes). + Gigabytes, + /// The unit is in terabytes (10^12 bytes). + Terabytes, + /// The unit is in kibibytes (2^10 bytes). + Kibibytes, + /// The unit is in mebibytes (2^20 bytes). + Mebibytes, + /// The unit is in gibibytes (2^30 bytes). + Gibibytes, + /// The unit is in tebibytes (2^40 bytes). + Tebibytes, +} + +impl StorageUnit { + /// Converts the given number of bytes into a float representing the number + /// of units. + pub fn convert(&self, bytes: u64) -> f64 { + let bytes = bytes as f64; + match self { + Self::Bytes => bytes, + Self::Kilobytes => bytes / 1000.0, + Self::Megabytes => bytes / 1000000.0, + Self::Gigabytes => bytes / 1000000000.0, + Self::Terabytes => bytes / 1000000000000.0, + Self::Kibibytes => bytes / 1024.0, + Self::Mebibytes => bytes / 1048576.0, + Self::Gibibytes => bytes / 1073741824.0, + Self::Tebibytes => bytes / 1099511627776.0, + } + } +} + +impl FromStr for StorageUnit { + type Err = (); + + fn from_str(s: &str) -> Result { + match s { + "B" => Ok(Self::Bytes), + "KB" | "K" => Ok(Self::Kilobytes), + "MB" | "M" => Ok(Self::Megabytes), + "GB" | "G" => Ok(Self::Gigabytes), + "TB" | "T" => Ok(Self::Terabytes), + "KiB" | "Ki" => Ok(Self::Kibibytes), + "MiB" | "Mi" => Ok(Self::Mebibytes), + "GiB" | "Gi" => Ok(Self::Gibibytes), + "TiB" | "Ti" => Ok(Self::Tebibytes), + _ => Err(()), + } + } +} diff --git a/wdl-engine/src/value.rs b/wdl-engine/src/value.rs index eb1e9f886..47e7e5233 100644 --- a/wdl-engine/src/value.rs +++ b/wdl-engine/src/value.rs @@ -12,14 +12,17 @@ use anyhow::anyhow; use anyhow::bail; use indexmap::IndexMap; use ordered_float::OrderedFloat; -use serde_json::Value as JsonValue; +use serde::ser::SerializeMap; +use serde::ser::SerializeSeq; use wdl_analysis::types::ArrayType; +use wdl_analysis::types::Coercible as _; use wdl_analysis::types::CompoundTypeDef; use wdl_analysis::types::Optional; use wdl_analysis::types::PrimitiveTypeKind; use wdl_analysis::types::Type; use wdl_analysis::types::TypeEq; use wdl_analysis::types::Types; +use wdl_grammar::lexer::v1::is_ident; /// Implemented on coercible values. pub trait Coercible: Sized { @@ -46,63 +49,6 @@ pub enum Value { } impl Value { - /// Converts a JSON value into a WDL value. - /// - /// Returns an error if the JSON value cannot be represented as a WDL value. - pub fn from_json(types: &mut Types, value: JsonValue) -> Result { - match value { - JsonValue::Null => Ok(Value::None), - JsonValue::Bool(value) => Ok(value.into()), - JsonValue::Number(number) => { - if let Some(value) = number.as_i64() { - Ok(value.into()) - } else if let Some(value) = number.as_f64() { - Ok(value.into()) - } else { - bail!("number `{number}` is out of range for a WDL value") - } - } - JsonValue::String(s) => Ok(PrimitiveValue::new_string(s).into()), - JsonValue::Array(elements) => { - let elements = elements - .into_iter() - .map(|v| Self::from_json(types, v)) - .collect::>>()?; - - let element_ty = elements - .iter() - .try_fold(None, |mut ty, element| { - let element_ty = element.ty(); - let ty = ty.get_or_insert(element_ty); - ty.common_type(types, element_ty).map(Some).ok_or_else(|| { - anyhow!( - "a common element type does not exist between `{ty}` and \ - `{element_ty}`", - ty = ty.display(types), - element_ty = element_ty.display(types) - ) - }) - }) - .context("invalid WDL array value")? - .unwrap_or(Type::Union); - - let ty = types.add_array(ArrayType::new(element_ty)); - Ok(Array::new(types, ty, elements) - .with_context(|| { - format!("cannot coerce value to `{ty}`", ty = ty.display(types)) - })? - .into()) - } - JsonValue::Object(elements) => Ok(Object::new( - elements - .into_iter() - .map(|(k, v)| Ok((k, Self::from_json(types, v)?))) - .collect::>>()?, - ) - .into()), - } - } - /// Gets the type of the value. pub fn ty(&self) -> Type { match self { @@ -189,7 +135,7 @@ impl Value { pub fn as_string(&self) -> Option<&Arc> { match self { Self::Primitive(PrimitiveValue::String(s)) => Some(s), - _ => panic!("value is not a string"), + _ => None, } } @@ -376,6 +322,183 @@ impl Value { _ => None, } } + + /// Serializes the value to the given serializer. + pub fn serialize(&self, types: &Types, serializer: S) -> Result + where + S: serde::Serializer, + { + use serde::Serialize; + + match self { + Self::None => serializer.serialize_none(), + Self::Primitive(v) => v.serialize(serializer), + Self::Compound(v) => v.serialize(types, serializer), + } + } + + /// Deserializes a value from the given deserializer. + pub fn deserialize<'de, D>( + types: &mut Types, + deserializer: D, + ) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + /// Helper for deserializing the elements of sequences and maps + struct Deserialize<'a>(&'a mut Types); + + impl<'de> serde::de::DeserializeSeed<'de> for Deserialize<'_> { + type Value = Value; + + fn deserialize(self, deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + deserializer.deserialize_any(Visitor(self.0)) + } + } + + /// Visitor for deserialization. + struct Visitor<'a>(&'a mut Types); + + impl<'de> serde::de::Visitor<'de> for Visitor<'_> { + type Value = Value; + + fn visit_unit(self) -> std::result::Result + where + E: serde::de::Error, + { + Ok(Value::None) + } + + fn visit_none(self) -> std::result::Result + where + E: serde::de::Error, + { + Ok(Value::None) + } + + fn visit_some(self, deserializer: D) -> std::result::Result + where + D: serde::Deserializer<'de>, + { + Value::deserialize(self.0, deserializer) + } + + fn visit_bool(self, v: bool) -> std::result::Result + where + E: serde::de::Error, + { + Ok(Value::Primitive(PrimitiveValue::Boolean(v))) + } + + fn visit_i64(self, v: i64) -> std::result::Result + where + E: serde::de::Error, + { + Ok(Value::Primitive(PrimitiveValue::Integer(v))) + } + + fn visit_u64(self, v: u64) -> std::result::Result + where + E: serde::de::Error, + { + Ok(Value::Primitive(PrimitiveValue::Integer( + v.try_into().map_err(|_| { + E::custom("integer not in range for a 64-bit signed integer") + })?, + ))) + } + + fn visit_f64(self, v: f64) -> std::result::Result + where + E: serde::de::Error, + { + Ok(Value::Primitive(PrimitiveValue::Float(v.into()))) + } + + fn visit_str(self, v: &str) -> std::result::Result + where + E: serde::de::Error, + { + Ok(Value::Primitive(PrimitiveValue::new_string(v))) + } + + fn visit_string(self, v: String) -> std::result::Result + where + E: serde::de::Error, + { + Ok(Value::Primitive(PrimitiveValue::new_string(v))) + } + + fn visit_seq(self, mut seq: A) -> std::result::Result + where + A: serde::de::SeqAccess<'de>, + { + use serde::de::Error; + + let mut elements = Vec::new(); + while let Some(v) = seq.next_element_seed(Deserialize(self.0))? { + elements.push(v); + } + + let element_ty = elements + .iter() + .try_fold(None, |mut ty, element| { + let element_ty = element.ty(); + let ty = ty.get_or_insert(element_ty); + ty.common_type(self.0, element_ty).map(Some).ok_or_else(|| { + A::Error::custom(format!( + "a common element type does not exist between `{ty}` and \ + `{element_ty}`", + ty = ty.display(self.0), + element_ty = element_ty.display(self.0) + )) + }) + })? + .unwrap_or(Type::Union); + + let ty = self.0.add_array(ArrayType::new(element_ty)); + Ok(Array::new(self.0, ty, elements) + .map_err(|e| { + A::Error::custom(format!( + "cannot coerce value to `{ty}`: {e:#}", + ty = ty.display(self.0) + )) + })? + .into()) + } + + fn visit_map(self, mut map: A) -> std::result::Result + where + A: serde::de::MapAccess<'de>, + { + use serde::de::Error; + + let mut members = IndexMap::new(); + while let Some(key) = map.next_key::()? { + if !is_ident(&key) { + return Err(A::Error::custom(format!( + "object key `{key}` is not a valid WDL identifier" + ))); + } + + members.insert(key, map.next_value_seed(Deserialize(self.0))?); + } + + Ok(Value::Compound(CompoundValue::Object(Object { + members: Arc::new(members), + }))) + } + + fn expecting(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "a WDL value") + } + } + + deserializer.deserialize_any(Visitor(types)) + } } impl fmt::Display for Value { @@ -588,7 +711,7 @@ impl PrimitiveValue { pub fn as_string(&self) -> Option<&Arc> { match self { Self::String(s) => Some(s), - _ => panic!("value is not a string"), + _ => None, } } @@ -861,6 +984,20 @@ impl Coercible for PrimitiveValue { } } +impl serde::Serialize for PrimitiveValue { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + match self { + Self::Boolean(v) => v.serialize(serializer), + Self::Integer(v) => v.serialize(serializer), + Self::Float(v) => v.serialize(serializer), + Self::String(s) | Self::File(s) | Self::Directory(s) => s.serialize(serializer), + } + } +} + /// Represents a `Pair` value. #[derive(Debug, Clone)] pub struct Pair { @@ -940,7 +1077,7 @@ pub struct Array { /// The type of the array. ty: Type, /// The array's elements. - elements: Arc<[Value]>, + elements: Arc>, } impl Array { @@ -963,16 +1100,18 @@ impl Array { let element_type = array_ty.element_type(); return Ok(Self { ty, - elements: elements - .into_iter() - .enumerate() - .map(|(i, v)| { - let v = v.into(); - v.coerce(types, element_type).with_context(|| { - format!("failed to coerce array element at index {i}") + elements: Arc::new( + elements + .into_iter() + .enumerate() + .map(|(i, v)| { + let v = v.into(); + v.coerce(types, element_type).with_context(|| { + format!("failed to coerce array element at index {i}") + }) }) - }) - .collect::>()?, + .collect::>>()?, + ), }); } } @@ -980,6 +1119,12 @@ impl Array { panic!("type `{ty}` is not an array type", ty = ty.display(types)); } + /// Constructs a new array without checking the given elements conform to + /// the given type. + pub(crate) fn new_unchecked(ty: Type, elements: Arc>) -> Self { + Self { ty, elements } + } + /// Gets the type of the `Array` value. pub fn ty(&self) -> Type { self.ty @@ -1069,6 +1214,12 @@ impl Map { panic!("type `{ty}` is not a map type", ty = ty.display(types)); } + /// Constructs a new map without checking the given elements conform to the + /// given type. + pub(crate) fn new_unchecked(ty: Type, elements: Arc>) -> Self { + Self { ty, elements } + } + /// Gets the type of the `Map` value. pub fn ty(&self) -> Type { self.ty @@ -1100,7 +1251,7 @@ impl fmt::Display for Map { #[derive(Debug, Clone)] pub struct Object { /// The members of the object. - members: Arc>, + pub(crate) members: Arc>, } impl Object { @@ -1167,7 +1318,7 @@ pub struct Struct { /// The name of the struct. name: Arc, /// The members of the struct value. - members: Arc>, + pub(crate) members: Arc>, } impl Struct { @@ -1460,6 +1611,76 @@ impl CompoundValue { _ => None, } } + + /// Serializes the value to the given serializer. + pub fn serialize(&self, types: &Types, serializer: S) -> Result + where + S: serde::Serializer, + { + use serde::ser::Error; + + /// Helper `Serialize` implementation for serializing element values. + struct Serialize<'a> { + /// The types collection. + types: &'a Types, + /// The value being serialized. + value: &'a Value, + } + + impl serde::Serialize for Serialize<'_> { + fn serialize(&self, serializer: S) -> std::result::Result + where + S: serde::Serializer, + { + self.value.serialize(self.types, serializer) + } + } + + match self { + Self::Pair(_) => Err(S::Error::custom("a pair cannot be serialized")), + Self::Array(v) => { + let mut s = serializer.serialize_seq(Some(v.elements.len()))?; + for e in v.elements.iter() { + s.serialize_element(&Serialize { types, value: e })?; + } + + s.end() + } + Self::Map(v) => { + if !types + .type_definition( + v.ty() + .as_compound() + .expect("type should be compound") + .definition(), + ) + .as_map() + .expect("type should be a map") + .key_type() + .is_coercible_to(types, &PrimitiveTypeKind::String.into()) + { + return Err(S::Error::custom( + "only maps with `String` key types may be serialized", + )); + } + + let mut s = serializer.serialize_map(Some(v.elements.len()))?; + for (k, v) in v.elements.iter() { + s.serialize_entry(k, &Serialize { types, value: v })?; + } + + s.end() + } + Self::Object(Object { members, .. }) | Self::Struct(Struct { members, .. }) => { + let mut s = serializer.serialize_map(Some(members.len()))?; + for (k, v) in members.iter() { + s.serialize_entry(k, &Serialize { types, value: v })?; + } + + s.end() + } + } + } } impl fmt::Display for CompoundValue { diff --git a/wdl-engine/tests/inputs/invalid-wdl-array/error.txt b/wdl-engine/tests/inputs/invalid-wdl-array/error.txt index fdfe76610..5d1027a60 100644 --- a/wdl-engine/tests/inputs/invalid-wdl-array/error.txt +++ b/wdl-engine/tests/inputs/invalid-wdl-array/error.txt @@ -2,5 +2,4 @@ failed to parse input file `tests/inputs/invalid-wdl-array/inputs.json` Caused by: 0: invalid input key `test.x` - 1: invalid WDL array value - 2: a common element type does not exist between `Int` and `String` \ No newline at end of file + 1: a common element type does not exist between `Int` and `String` \ No newline at end of file diff --git a/wdl-format/src/element/node.rs b/wdl-format/src/element/node.rs index 9ef74309b..d2f1ea616 100644 --- a/wdl-format/src/element/node.rs +++ b/wdl-format/src/element/node.rs @@ -1,4 +1,4 @@ -//! A wrapper for formatting [`AstNode`]s. +//! A wrapper for formatting [`Node`]s. use wdl_ast::Element; use wdl_ast::Node; diff --git a/wdl-grammar/src/lexer/v1.rs b/wdl-grammar/src/lexer/v1.rs index b8fd45f1e..55f824499 100644 --- a/wdl-grammar/src/lexer/v1.rs +++ b/wdl-grammar/src/lexer/v1.rs @@ -11,6 +11,16 @@ use crate::parser::Parser; use crate::parser::ParserToken; use crate::tree::SyntaxKind; +/// Determines if the given string is a valid WDL identifier. +pub fn is_ident(s: &str) -> bool { + let mut lexer = Token::lexer(s); + if !lexer.next().map(|r| r.is_ok()).unwrap_or(false) { + return false; + } + + lexer.next().is_none() +} + /// Represents a token for supported escape sequences. #[derive(Logos, Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(u8)] diff --git a/wdl/CHANGELOG.md b/wdl/CHANGELOG.md index 7211db178..1213fa65e 100644 --- a/wdl/CHANGELOG.md +++ b/wdl/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Fixed + +* Fixed accepting directories for the `check` and `analyze` commands for the + `wdl` binary ([#254](https://github.com/stjude-rust-labs/wdl/pull/254)). + ## 0.10.0 - 10-22-2024 ### Changed diff --git a/wdl/src/bin/wdl.rs b/wdl/src/bin/wdl.rs index 67e6289bd..f601c1778 100644 --- a/wdl/src/bin/wdl.rs +++ b/wdl/src/bin/wdl.rs @@ -105,15 +105,19 @@ async fn analyze>( }, ); - let file = if let Ok(url) = Url::parse(&file) { - url + if let Ok(url) = Url::parse(&file) { + analyzer.add_document(url).await?; + } else if fs::metadata(&file) + .with_context(|| format!("failed to read metadata for file `{file}`"))? + .is_dir() + { + analyzer.add_directory(file.into()).await?; } else if let Some(url) = path_to_uri(&file) { - url + analyzer.add_document(url).await?; } else { bail!("failed to convert `{file}` to a URI", file = file) - }; + } - analyzer.add_document(file).await?; let results = analyzer .analyze(bar.clone()) .await