Class: HaveAPI::GoClient::MemberNameAllocator

Inherits:
Object
  • Object
show all
Defined in:
lib/haveapi/go_client/utils.rb

Instance Method Summary collapse

Constructor Details

#initialize(reserved = []) ⇒ MemberNameAllocator

Returns a new instance of MemberNameAllocator.



6
7
8
# File 'lib/haveapi/go_client/utils.rb', line 6

def initialize(reserved = [])
  @used = reserved.to_h { |name| [name, true] }
end

Instance Method Details

#allocate(preferred, suffix:, identity:) ⇒ String

Allocate a Go struct member name while preserving the preferred name whenever it does not collide with another field or method.

Parameters:

  • preferred (String)
  • suffix (String)
  • identity (String)

Returns:

  • (String)


17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/haveapi/go_client/utils.rb', line 17

def allocate(preferred, suffix:, identity:)
  return use(preferred) unless @used[preferred]

  suffixed = "#{preferred}#{suffix}"
  return use(suffixed) unless @used[suffixed]

  digest = Digest::SHA1.hexdigest(identity)

  (8..digest.length).each do |length|
    candidate = "#{suffixed}_#{digest[0, length]}"
    return use(candidate) unless @used[candidate]
  end

  index = 2
  loop do
    candidate = "#{suffixed}_#{digest}_#{index}"
    return use(candidate) unless @used[candidate]

    index += 1
  end
end