class AT_URI class InvalidURIError end TID_PATTERN = /^[234567abcdefghij][234567abcdefghijklmnopqrstuvwxyz]{12}$/ attr_reader :repo, :collection, :rkey def initialize(uri) uri = uri.to_s raise InvalidURIError, "Invalid AT URI: #{uri}" if uri.include?(' ') || !uri.start_with?('at://') parts = uri.split('/') parts.each(&:freeze) raise InvalidURIError, "Invalid AT URI: #{uri}" if parts.length != 5 || parts[2..4].any?(&:empty?) @uri = uri @repo, @collection, @rkey = parts[2..4] end def to_ary [@repo, @collection, @rkey] end alias split to_ary def to_s @uri end def has_valid_tid? @rkey =~ TID_PATTERN end def is_post? @collection == 'app.bsky.feed.post' && has_valid_tid? end end def AT_URI(uri) return uri if uri.is_a?(AT_URI) AT_URI.new(uri) end