Created
November 10, 2015 09:50
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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