module Sprout

module Executable

  ##
  # Concrete Sprout::Executable::Param object for File values.
  #
  # This class is used in Sprout::Excecutable s with:
  #
  #   add_param :some_name, File
  #
  # This parameter is truly special in that whatever values
  # are sent to the File parameter will be added to the underlying
  # Rake task as prerequisites and must exist before +Sprout::Executable.execute+
  # is called - _unless_ the parameter value
  # matches the Sprout::Executable instance's +output+ value.
  #
  # Of course this will only be the case if there is a Rake
  # task wrapper for the Executable, if the Sprout::Executable
  # is being used to create a Ruby executable, then these File
  # parameters will only be validated before execution.
  #
  # @see Sprout::Executable::Param
  #
  class FileParam < Param 

    attr_accessor :file_task_name

    def initialize
      super
      @option_parser_type_name = 'FILE'
    end

    def shell_value
      clean_path value
    end

    def prepare_prerequisites
      if file_task_name
        self.value ||= belongs_to.rake_task_name
        return
      end

      if prerequisite?(value)
        file value
        belongs_to.prerequisites << value
      end
    end

    def validate
      super

      if(!file_task_name && !value.nil? && !File.exists?(value))
        raise Sprout::Errors::InvalidArgumentError.new "No such file or directory - #{value}"
      end
    end

    private

    def prerequisite?(file)
      file && !file_is_output?(file)
    end
  end
end

end