1use magnus::prelude::*;
6use magnus::{Error, Ruby, method};
7
8use lindera::token::Token;
9
10#[magnus::wrap(class = "Lindera::Token", free_immediately, size)]
14pub struct RbToken {
15 surface: String,
17 byte_start: usize,
19 byte_end: usize,
21 position: usize,
23 word_id: u32,
25 is_unknown: bool,
27 details: Vec<String>,
29}
30
31impl RbToken {
32 pub fn from_token(token: Token) -> Self {
42 Self::from_view(lindera_binding_core::TokenView::from_token(token))
43 }
44
45 pub fn from_view(view: lindera_binding_core::TokenView) -> Self {
55 Self {
56 surface: view.surface,
57 byte_start: view.byte_start,
58 byte_end: view.byte_end,
59 position: view.position,
60 word_id: view.word_id,
61 is_unknown: view.is_unknown,
62 details: view.details,
63 }
64 }
65
66 fn surface(&self) -> String {
68 self.surface.clone()
69 }
70
71 fn byte_start(&self) -> usize {
73 self.byte_start
74 }
75
76 fn byte_end(&self) -> usize {
78 self.byte_end
79 }
80
81 fn position(&self) -> usize {
83 self.position
84 }
85
86 fn word_id(&self) -> u32 {
88 self.word_id
89 }
90
91 fn is_unknown(&self) -> bool {
93 self.is_unknown
94 }
95
96 fn details(&self) -> Vec<String> {
98 self.details.clone()
99 }
100
101 fn get_detail(&self, index: usize) -> Option<String> {
111 self.details.get(index).cloned()
112 }
113
114 fn to_s(&self) -> String {
116 self.surface.clone()
117 }
118
119 fn inspect(&self) -> String {
121 format!(
122 "#<Lindera::Token surface='{}', start={}, end={}, position={}, word_id={}, unknown={}>",
123 self.surface,
124 self.byte_start,
125 self.byte_end,
126 self.position,
127 self.word_id,
128 self.is_unknown
129 )
130 }
131}
132
133pub fn define(ruby: &Ruby, module: &magnus::RModule) -> Result<(), Error> {
144 let token_class = module.define_class("Token", ruby.class_object())?;
145 token_class.define_method("surface", method!(RbToken::surface, 0))?;
146 token_class.define_method("byte_start", method!(RbToken::byte_start, 0))?;
147 token_class.define_method("byte_end", method!(RbToken::byte_end, 0))?;
148 token_class.define_method("position", method!(RbToken::position, 0))?;
149 token_class.define_method("word_id", method!(RbToken::word_id, 0))?;
150 token_class.define_method("unknown?", method!(RbToken::is_unknown, 0))?;
151 token_class.define_method("details", method!(RbToken::details, 0))?;
152 token_class.define_method("get_detail", method!(RbToken::get_detail, 1))?;
153 token_class.define_method("to_s", method!(RbToken::to_s, 0))?;
154 token_class.define_method("inspect", method!(RbToken::inspect, 0))?;
155
156 Ok(())
157}