Farmbot-Web-App/latest_corpus.rb

143 lines
4.1 KiB
Ruby
Executable File

class CorpusEmitter
PIPE = "\n | "
class CSArg
TRANSLATIONS = {"integer" => "number",
"string" => "string" }
attr_reader :name, :allowed_values
def initialize(name:, allowed_values:)
@name, @allowed_values = name, allowed_values
end
def camelize
name.camelize
end
def values
allowed_values.map { |v| TRANSLATIONS[v] || v.camelize }.join(PIPE)
end
def to_ts
"\n #{name}: #{values};"
end
end
class CSNode
UNDEFINED = "undefined"
attr_reader :name, :allowed_args, :allowed_body_types
def initialize(name:, allowed_args:, allowed_body_types: [])
@name,
@allowed_args,
@allowed_body_types = name, allowed_args, allowed_body_types
end
def camelize
name.camelize
end
def arg_names
allowed_args
.map{ |x| ARGS[x] }
.each { |x| raise "NON-EXISTENT ARG TYPE" unless x }
.map(&:to_ts)
.join("")
end
def items_joined_by_pipe
allowed_body_types.map(&:camelize).join(PIPE)
end
def body_names
b = items_joined_by_pipe
(b.length > 0) ? "(#{b})[] | undefined" : UNDEFINED
end
def has_body?
body_names != UNDEFINED
end
def body_type
"export type #{camelize}BodyItem = #{items_joined_by_pipe};" if has_body?
end
def body_attr
"body?: #{ has_body? ? (camelize + "BodyItem[] | undefined") : UNDEFINED };"
end
def to_ts
"""
#{body_type}
export interface #{camelize} {
kind: #{name.inspect};
args: {#{arg_names}
};
comment?: string | undefined;
#{body_attr}
}
"""
end
end
HASH = JSON.load(open("http://localhost:3000/api/corpus")).deep_symbolize_keys
ARGS = {}
HASH[:args].map{ |x| CSArg.new(x) }.each{|x| ARGS[x.name] = x}
NODES = HASH[:nodes].map { |x| CSNode.new(x) }
def const(key, val)
"\nexport const #{key} = #{val};"
end
def enum_type(key, val, inspect = true)
"\nexport type #{key} = #{(inspect ? val.map(&:inspect) : val).join(PIPE)};"
end
def self.generate
self.new.generate
end
def generate
result = NODES.map(&:to_ts)
result.unshift("""
// THIS INTERFACE WAS AUTO GENERATED ON #{Date.today}
// DO NOT EDIT THIS FILE.
// IT WILL BE OVERWRITTEN ON EVERY CELERYSCRIPT UPGRADE.
""")
result.push(enum_type :CeleryNode, NODES.map(&:name).map(&:camelize), false)
result.push(const(:LATEST_VERSION, Sequence::LATEST_VERSION))
result.push(const :DIGITAL, CeleryScriptSettingsBag::DIGITAL)
result.push(const :ANALOG, CeleryScriptSettingsBag::ANALOG)
result.push(enum_type :ALLOWED_PIN_MODES,
CeleryScriptSettingsBag::ALLOWED_PIN_MODES)
result.push(enum_type :ALLOWED_MESSAGE_TYPES,
CeleryScriptSettingsBag::ALLOWED_MESSAGE_TYPES)
result.push(enum_type :ALLOWED_CHANNEL_NAMES,
CeleryScriptSettingsBag::ALLOWED_CHANNEL_NAMES)
result.push(enum_type :ALLOWED_DATA_TYPES,
CeleryScriptSettingsBag::ALLOWED_DATA_TYPES)
result.push(enum_type :ALLOWED_OPS,
CeleryScriptSettingsBag::ALLOWED_OPS)
result.push(enum_type :ALLOWED_PACKAGES,
CeleryScriptSettingsBag::ALLOWED_PACKAGES)
result.push(enum_type :ALLOWED_AXIS, CeleryScriptSettingsBag::ALLOWED_AXIS)
result.push(enum_type :Color, Sequence::COLORS)
result.push(enum_type :LegalArgString, HASH[:args].map{ |x| x[:name] }.sort.uniq)
result.push(enum_type :LegalKindString, HASH[:nodes].map{ |x| x[:name] }.sort.uniq)
result.push(enum_type :LegalSequenceKind, CeleryScriptSettingsBag::STEPS.sort)
result.push(enum_type :DataChangeType, CeleryScriptSettingsBag::ALLOWED_CHAGES)
result.push(enum_type :PointType, CeleryScriptSettingsBag::ALLOWED_POINTER_TYPE)
result.push(enum_type :AllowedPinTypes, CeleryScriptSettingsBag::ALLOWED_PIN_TYPES)
result.push(enum_type :PlantStage, CeleryScriptSettingsBag::PLANT_STAGES)
File.open("latest_corpus.ts", "w") do |f|
f.write(result.join.gsub("\n\n\n", "\n").gsub("\n\n", "\n").strip)
end
end
end
CorpusEmitter.generate