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