# Lair Configuration DSL Case Study (Python 3)
# Global Function Sequence DSL: Configuration Buider (builder08)
# H. Conrad Cunningham

# Developed for CSci 658, Software Language Engineering, Spring 2018

#234567890123456789012345678901234567890123456789012345678901234567890

# 2018-02-27: (V1) adapted from M. Fowler's Ruby version builder8.rb
#             and my Lua version builder08.lua

# Import Semantic Model for Configuration
from model import *

# Create and intialize DSL Context Variables
config = None
current_item = None
current_acid = None

# Read and execute a DSL input file
def load_dsl(dsl_file):
    global config, current_item, current_acid
    with open(dsl_file, 'r') as f:
        dsl_str = f.read()
    exec(dsl_str)
    return config

# Added for Python (and Lua) versions
# Start/restart a Configuration build (may be needed to build
# multiple Configurations in one run)

def configuration():
    global config, current_item, current_acid
    config = Configuration()
    current_item = None
    current_acid = None

def item(name):
    global config, current_item
    if config == None:
        configuration()
    current_item = Item(name)
    config.add_item(current_item)

def uses(resource):
    global current_item
    current_item.add_usage(resource)

def acid():
    global current_acid
    current_acid = Acid()
    return current_acid

def acid_type(type):
    global current_acid
    current_acid.type = type

def acid_grade(grade):
    global current_acid
    current_acid.grade = grade

def provides(resource):
    global current_item
    current_item.add_provision(resource)

def depends(supplier):
    global config, current_item
    current_item.add_dependency(config.get_item(supplier))

def electricity(power):
  return Electricity(power)

# Added for Python version
# Return value of config to caller's namespace

def get_config():
    global config
    return config
