Skip to content

Instantly share code, notes, and snippets.

@sonsongithub
Created November 10, 2015 09:50
Show Gist options
  • Select an option

  • Save sonsongithub/09177dd82d9b3689938b to your computer and use it in GitHub Desktop.

Select an option

Save sonsongithub/09177dd82d9b3689938b to your computer and use it in GitHub Desktop.
Swift source code generator from https://www.reddit.com/dev/api#GET_api_v1_me_prefs
class PreferenceStruct
def initialize(line)
typeTable = {
"boolean"=>"Bool",
"an integer between"=>"Int",
"a valid IETF language tag"=>"String",
"subreddit name" => "String",
"one of \\(`on`, `off`, `subreddit`\\)" => "PreferenceMediaType",
"one of \\(`confidence`, `old`, `top`, `qa`, `controversial`, `new`\\)" => "PreferenceDefaultCommentSortType"
}
if line =~ /\"(.+?)\"\: (.+),$/
@originalName = $1
@originalType = $2
end
@name = @originalName.gsub(/_(.)/) {$1.upcase}
typeTable.each_pair{|key, value|
if @originalType =~ /#{key}/
@type = value
break
end
}
end
def generateDeclaration
sprintf(" let %s:%s?\n", @name, @type)
end
def PreferenceStruct.generateDeclaration(array)
array.map {|item| item.generateDeclaration }.join
end
def generateCodeToInitWithAllParametersForArgments
sprintf(" #{@name}:#{@type}? = nil")
end
def generateCodeToInitWithAllParameters
sprintf(" self.#{@name} = #{@name}\n")
end
def PreferenceStruct.generateCodeToInitWithAllParameters(array)
buf = ""
buf = buf + " public init(\n"
buf = buf + array.map {|item| item.generateCodeToInitWithAllParametersForArgments }.join(",\n") + "\n"
buf = buf + ") {\n"
buf = buf + array.map {|item| item.generateCodeToInitWithAllParameters }.join
buf = buf + " }\n"
end
def generateCodeToInitWithJSON
buf = ""
if (@type == "PreferenceMediaType" || @type == "PreferenceDefaultCommentSortType")
buf = buf + sprintf(" if let temp = json[\"#{@originalName}\"] as? String { self.#{@name} = #{@type}(temp) }\n")
buf = buf + sprintf(" else { self.#{@name} = nil }\n")
else
buf = buf + sprintf(" self.#{@name} = json[\"#{@originalName}\"] as? #{@type}\n")
end
end
def PreferenceStruct.generateCodeToInitWithJSON(array)
buf = ""
buf = buf + " public init(json:[String:AnyObject]) {\n"
buf = buf + array.map{|item| item.generateCodeToInitWithJSON}.join
buf = buf + " }\n"
end
def generateCodeToGenerateJSON
if (@type == "PreferenceMediaType" || @type == "PreferenceDefaultCommentSortType")
sprintf(" if let temp = #{@name} { json[\"#{@originalName}\"] = temp.rawValue }\n")
else
sprintf(" if let temp = #{@name} { json[\"#{@originalName}\"] = temp }\n")
end
end
def PreferenceStruct.generateCodeToGenerateJSON(array)
buf = ""
buf = buf + " public func json() -> [String:AnyObject] {\n"
buf = buf + " var json:[String:AnyObject] = [:]\n"
buf = buf + array.map {|item| item.generateCodeToGenerateJSON }.join
buf = buf + " return json\n"
buf = buf + " }\n"
end
def PreferenceStruct.generateSourceCode(data)
array = data.each_line.map {|line| PreferenceStruct.new(line)}
puts "public struct Preference {"
puts PreferenceStruct.generateDeclaration(array)
puts PreferenceStruct.generateCodeToGenerateJSON(array)
puts PreferenceStruct.generateCodeToInitWithJSON(array)
puts PreferenceStruct.generateCodeToInitWithAllParameters(array)
puts "}"
end
end
PreferenceStruct.generateSourceCode(<<"EOS"
\"beta\": boolean value,
\"clickgadget\": boolean value,
\"collapse_read_messages\": boolean value,
\"compress\": boolean value,
\"creddit_autorenew\": boolean value,
\"default_comment_sort\": one of (`confidence`, `old`, `top`, `qa`, `controversial`, `new`),
\"domain_details\": boolean value,
\"email_messages\": boolean value,
\"enable_default_themes\": boolean value,
\"hide_ads\": boolean value,
\"hide_downs\": boolean value,
\"hide_from_robots\": boolean value,
\"hide_locationbar\": boolean value,
\"hide_ups\": boolean value,
\"highlight_controversial\": boolean value,
\"highlight_new_comments\": boolean value,
\"ignore_suggested_sort\": boolean value,
\"label_nsfw\": boolean value,
\"lang\": a valid IETF language tag (underscore separated),
\"legacy_search\": boolean value,
\"mark_messages_read\": boolean value,
\"media\": one of (`on`, `off`, `subreddit`),
\"min_comment_score\": an integer between -100 and 100,
\"min_link_score\": an integer between -100 and 100,
\"monitor_mentions\": boolean value,
\"newwindow\": boolean value,
\"no_profanity\": boolean value,
\"num_comments\": an integer between 1 and 500,
\"numsites\": an integer between 1 and 100,
\"organic\": boolean value,
\"other_theme\": subreddit name,
\"over_18\": boolean value,
\"private_feeds\": boolean value,
\"public_votes\": boolean value,
\"research\": boolean value,
\"show_flair\": boolean value,
\"show_gold_expiration\": boolean value,
\"show_link_flair\": boolean value,
\"show_promote\": boolean value,
\"show_stylesheets\": boolean value,
\"show_trending\": boolean value,
\"store_visits\": boolean value,
\"theme_selector\": subreddit name,
\"threaded_messages\": boolean value,
\"threaded_modmail\": boolean value,
\"use_global_defaults\": boolean value,
EOS
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment