Don't forget to lycansubscribe
1class AT_URI 2 class InvalidURIError 3 end 4 5 TID_PATTERN = /^[234567abcdefghij][234567abcdefghijklmnopqrstuvwxyz]{12}$/ 6 7 attr_reader :repo, :collection, :rkey 8 9 def initialize(uri) 10 uri = uri.to_s 11 raise InvalidURIError, "Invalid AT URI: #{uri}" if uri.include?(' ') || !uri.start_with?('at://') 12 13 parts = uri.split('/') 14 parts.each(&:freeze) 15 16 raise InvalidURIError, "Invalid AT URI: #{uri}" if parts.length != 5 || parts[2..4].any?(&:empty?) 17 18 @uri = uri 19 @repo, @collection, @rkey = parts[2..4] 20 end 21 22 def to_ary 23 [@repo, @collection, @rkey] 24 end 25 26 alias split to_ary 27 28 def to_s 29 @uri 30 end 31 32 def has_valid_tid? 33 @rkey =~ TID_PATTERN 34 end 35 36 def is_post? 37 @collection == 'app.bsky.feed.post' && has_valid_tid? 38 end 39end 40 41def AT_URI(uri) 42 return uri if uri.is_a?(AT_URI) 43 AT_URI.new(uri) 44end