class Aws::Api::Docs::ParamFormatter

def apply_comments(ref, text)

def apply_comments(ref, text)
  lines = text.lines.to_a
  if lines[0].match(/\n$/)
    lines[0] = lines[0].sub(/\n$/, comments(ref) + "\n")
  else
    lines[0] += comments(ref)
  end
  lines.join
end

def comments(ref)

def comments(ref)
  comments = []
  if ref[:response_target]
    comments << 'where to write response data, file path, or IO object'
  end
  if ref[:streaming]
    comments << 'file/IO object, or string data'
  end
  if ref.required
    comments << 'required'
  end
  if enum = enum_values(ref)
    comments << "accepts #{enum.to_a.join(', ')}"
  end
  if ddb_av?(ref)
    comments << 'value <Hash,Array,String,Numeric,Boolean,IO,Set,nil>'
  end
  comments == [] ? '' : " # #{comments.join(', ')}"
end

def complex?(ref)

def complex?(ref)
  if StructureShape === ref.shape
    !ddb_av?(ref)
  else
    ListShape === ref.shape || MapShape === ref.shape
  end
end

def complex_list(ref, i, visited)

def complex_list(ref, i, visited)
  "[\n#{i}  #{ref_value(ref, i + '  ', visited)},\n#{i}]"
end

def ddb_av?(ref)

def ddb_av?(ref)
  case ref.shape
  when ListShape then ddb_av?(ref.shape.member)
  when StructureShape then ref.shape.name == 'AttributeValue'
  else false
  end
end

def enum_values(ref)

def enum_values(ref)
  case ref.shape
  when ListShape then enum_values(ref.shape.member)
  when StringShape then ref.shape.enum
  else nil
  end
end

def format

def format
  if @shape_ref && @shape_ref.shape.member_names.count > 0
    ref_value(@shape_ref, '', [])
  else
    ''
  end
end

def initialize(shape_ref)

def initialize(shape_ref)
  @shape_ref = shape_ref
  @recursive_shapes = compute_recursive_shapes(@shape_ref)
end

def list(ref, i, visited)

def list(ref, i, visited)
  if complex?(ref.shape.member)
    complex_list(ref.shape.member, i, visited)
  else
    scalar_list(ref.shape.member, i, visited)
  end
end

def map(ref, i, visited)

def map(ref, i, visited)
  key = string(ref.shape.key)
  value = ref_value(ref.shape.value, i + '  ', visited)
  "{\n#{i}  #{key} => #{value},#{comments(ref.shape.value)}\n#{i}}"
end

def recursive?(ref)

def recursive?(ref)
  @recursive_shapes.include?(ref.shape)
end

def ref_value(ref, i, visited)

def ref_value(ref, i, visited)
  if visited.include?(ref.shape)
    return "{\n#{i}  # recursive #{ref.shape.name}\n#{i}}"
  else
    visited  = visited + [ref.shape]
  end
  case ref.shape
  when StructureShape
    if ref.shape.name == 'AttributeValue'
      '"value"'
    else
      struct(ref, i, visited)
    end
  when BlobShape
    if ref[:response_target]
      '"/path/to/file"'
    elsif ref[:streaming]
      'source_file'
    else
      '"data"'
    end
  when ListShape then list(ref, i, visited)
  when MapShape then map(ref, i, visited)
  when BooleanShape then "false"
  when IntegerShape then '1'
  when FloatShape then '1.0'
  when StringShape then string(ref)
  when TimestampShape then 'Time.now'
  else raise "unsupported shape #{ref.shape.class.name}"
  end
end

def scalar_list(ref, i, visited)

def scalar_list(ref, i, visited)
  "[#{ref_value(ref, i, visited)}]"
end

def string(ref)

def string(ref)
  if ref.shape.enum
    ref.shape.enum.first.inspect
  elsif ref.shape.name
    ref.shape.name.inspect
  else
    '"string"'
  end
end

def struct(ref, i, visited)

def struct(ref, i, visited)
  lines = ['{']
  ref.shape.members.each do |member_name, member_ref|
    lines << struct_member(member_name, member_ref, i, visited)
  end
  lines << "#{i}}"
  lines.join("\n")
end

def struct_member(member_name, member_ref, i, visited)

def struct_member(member_name, member_ref, i, visited)
  entry = "#{i}  #{member_name}: #{ref_value(member_ref, i + '  ', visited)},"
  apply_comments(member_ref, entry)
end