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