nextflow.script.ExecutionStack.groovy Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of nextflow Show documentation
Show all versions of nextflow Show documentation
A DSL modelled around the UNIX pipe concept, that simplifies writing parallel and scalable pipelines in a portable manner
/*
* Copyright 2013-2024, Seqera Labs
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package nextflow.script
import groovy.transform.CompileStatic
import groovy.transform.PackageScope
import nextflow.Global
import nextflow.Session
/**
* Holds the current execution context
*
* @author Paolo Di Tommaso
*/
@CompileStatic
class ExecutionStack {
static private List stack = new ArrayList<>()
static ExecutionContext current() {
stack ? stack.get(0) : null
}
static boolean withinWorkflow() {
for( def entry : stack ) {
if( entry instanceof WorkflowDef )
return true
}
return false
}
static WorkflowBinding binding() {
stack ? current().getBinding() : (Global.session as Session).getBinding()
}
static BaseScript script() {
for( def item in stack ) {
if( item instanceof BaseScript )
return item
}
throw new IllegalStateException("Missing execution script")
}
static BaseScript owner() {
def c = current()
if( c instanceof BaseScript )
return c
if( c instanceof WorkflowDef )
return c.getOwner()
throw new IllegalStateException("Not a valid scope object: [${c.getClass().getName()}] $this")
}
static WorkflowDef workflow() {
final ctx = current()
ctx instanceof WorkflowDef ? ctx : null
}
static void push(ExecutionContext script) {
stack.push(script)
}
static ExecutionContext pop() {
stack.pop()
}
static int size() {
stack.size()
}
@PackageScope
static void reset() {
stack = new ArrayList<>()
}
}