Search code examples
jsonrubythor

Ruby: calling method within another method's conditional statement


I'm trying to call the method print_json within a conditional statement that is contained in another method named list_trends. I did this becauese my code was starting to look too nested. However I get an error when I run that says:

syntax error, unexpected tSTRING_BEG, expecting keyword_do or '{' or '('
...i_key]) ? print_trends : puts "Invalid API Key, operation ab...

Here is my code:

#!/usr/bin/ruby

require 'thor'
require 'json'

class ListTrends < Thor
  desc "list trends", "list out trends from JSON file"

  option :api_key, :aliases => "--api-key", :type => :string, :required => true

  def print_json
    json = File.read('trends_available.json')
    trends_hash = JSON.parse(json)

    trends_hash.each do |key|
      key.each do |k,v|
        puts "Trend #{k}: #{v}"
      end
      puts ""
    end
  end

  def list_trends
    re = /^(?=.*[a-zA-Z])(?=.*[0-9]).{8,}$/
    if options[:api_key]
      if re.match(options[:api_key]) ? print_json : puts "Invalid API Key, operation abort..."
    end
  end
end

ListTrends.start(ARGV)

Solution

  • This

    if options[:api_key]
      if re.match(options[:api_key]) ? print_json : puts "Invalid API Key, operation abort..."
    end
    

    Should just be

    if options[:api_key]
      re.match(options[:api_key]) ? print_json : puts "Invalid API Key, operation abort..."
    end
    

    Though I would prefer:

    if options[:api_key]
      if re.match(options[:api_key]) 
        print_json
      else
        puts "Invalid API Key, operation abort..."
      end
    end
    

    Or if you must put it on one line:

    if options[:api_key]
      if re.match(options[:api_key]) then print_json else puts "Invalid API Key, operation abort..." end
    end