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 raise InvalidURIError, "Invalid AT URI: #{uri}" if uri.include?(' ') || !uri.start_with?('at://') 11 12 parts = uri.split('/') 13 parts.each(&:freeze) 14 15 raise InvalidURIError, "Invalid AT URI: #{uri}" if parts.length != 5 || parts[2..4].any?(&:empty?) 16 17 @uri = uri 18 @repo, @collection, @rkey = parts[2..4] 19 end 20 21 def to_ary 22 [@repo, @collection, @rkey] 23 end 24 25 alias split to_ary 26 27 def to_s 28 @uri 29 end 30 31 def has_valid_tid? 32 @rkey =~ TID_PATTERN 33 end 34 35 def is_post? 36 @collection == 'app.bsky.feed.post' && has_valid_tid? 37 end 38end 39 40def AT_URI(uri) 41 AT_URI.new(uri) 42end