001package jmri.jmrit.logixng;
002
003import java.util.Collection;
004
005import jmri.NamedBean;
006import jmri.jmrit.logixng.SymbolTable.InitialValueType;
007import jmri.jmrit.logixng.SymbolTable.VariableData;
008
009/**
010 * Represent a LogixNG module.
011 * A module is similar to a ConditionalNG, except that it can be used by
012 * both ConditionalNGs and modules.
013 *
014 * @author Daniel Bergqvist Copyright (C) 2020
015 */
016public interface Module extends Base, NamedBean {
017    
018//    void setRootSocketType(FemaleSocketManager.SocketType socketType);
019    
020    FemaleSocketManager.SocketType getRootSocketType();
021    
022    FemaleSocket getRootSocket();
023    
024    void setCurrentConditionalNG(ConditionalNG conditionalNG);
025    
026    void addParameter(String name, boolean isInput, boolean isOutput);
027    
028    void addParameter(Parameter parameter);
029    
030//    public void removeParameter(String name);
031    
032    void addLocalVariable(
033            String name,
034            SymbolTable.InitialValueType initialValueType,
035            String initialValueData);
036    
037//    public void removeLocalVariable(String name);
038    
039    Collection<Parameter> getParameters();
040    
041    Collection<VariableData> getLocalVariables();
042    
043    
044    /**
045     * The definition of a parameter.
046     */
047    interface Parameter {
048        
049        /**
050         * The name of the parameter
051         * @return the name
052         */
053        String getName();
054        
055        /**
056         * Answer whenether or not the parameter is input to the module.
057         * @return true if the parameter is input, false otherwise
058         */
059        boolean isInput();
060        
061        /**
062         * Answer whenether or not the parameter is output to the module.
063         * @return true if the parameter is output, false otherwise
064         */
065        boolean isOutput();
066        
067    }
068    
069    
070    /**
071     * Data for a parameter.
072     */
073    public static class ParameterData extends VariableData {
074        
075        public ReturnValueType _returnValueType = ReturnValueType.None;
076        public String _returnValueData;
077        
078        public ParameterData(
079                String name,
080                InitialValueType initialValueType,
081                String initialValueData,
082                ReturnValueType returnValueType,
083                String returnValueData) {
084            
085            super(name, initialValueType, initialValueData);
086            
087            _returnValueType = returnValueType;
088            _returnValueData = returnValueData;
089        }
090        
091        public ParameterData(ParameterData data) {
092            super(data._name, data._initialValueType, data._initialValueData);
093            _returnValueType = data._returnValueType;
094            _returnValueData = data._returnValueData;
095        }
096        
097        public ReturnValueType getReturnValueType() {
098            return _returnValueType;
099        }
100        
101        public String getReturnValueData() {
102            return _returnValueData;
103        }
104        
105    }
106    
107    
108    /**
109     * An enum that defines the types of initial value.
110     */
111    enum ReturnValueType {
112        
113        None(Bundle.getMessage("ReturnValueType_None")),
114        LocalVariable(Bundle.getMessage("ReturnValueType_LocalVariable")),
115        Memory(Bundle.getMessage("ReturnValueType_Memory"));
116        
117        private final String _descr;
118        
119        private ReturnValueType(String descr) {
120            _descr = descr;
121        }
122        
123        public String getDescr() {
124            return _descr;
125        }
126    }
127    
128    
129}