11use crate :: impls:: server:: FileOpenContext ;
22use crate :: impls:: util:: new_tokio_thread;
33use crate :: ui:: { AppContainer , Content , Tab , Top } ;
4- use crate :: { Accessor , AccessorEnum , AsmServer , LoadingState , ServerMut } ;
4+ use crate :: { Accessor , AccessorEnum , ArcNullable , AsmServer , LoadingState , ServerMut } ;
55use java_asm:: smali:: SmaliNode ;
66use java_asm:: { AsmErr , StrRef } ;
77use log:: { error, info} ;
88use std:: fs:: File ;
9- use std:: ops:: { Deref , DerefMut } ;
9+ use std:: ops:: Deref ;
1010use std:: sync:: Arc ;
1111use std:: time:: Instant ;
12+ use trie_rs:: { Trie , TrieBuilder } ;
1213use zip:: result:: ZipError ;
1314
1415impl AsmServer {
@@ -20,9 +21,35 @@ impl AsmServer {
2021 err : None ,
2122 } ,
2223 accessor : Default :: default ( ) ,
24+ classes : Default :: default ( ) ,
25+ trie : Default :: default ( ) ,
2326 }
2427 }
2528
29+ pub fn get_classes ( & self ) -> & ArcNullable < Vec < StrRef > > {
30+ let mut current = self . classes . lock ( ) ;
31+ if current. is_some ( ) { return & self . classes ; }
32+ let accessor_locked = self . accessor . lock ( ) ;
33+ let Some ( accessor) = accessor_locked. deref ( ) else { return & self . classes ; } ;
34+ let classes = accessor. read_classes ( ) ;
35+ current. replace ( classes) ;
36+ & self . classes
37+ }
38+
39+ pub fn get_trie ( & self ) -> & ArcNullable < Trie < u8 > > {
40+ let mut current = self . trie . lock ( ) ;
41+ if current. is_some ( ) { return & self . trie ; }
42+ let classes_locked = self . get_classes ( ) . lock ( ) ;
43+ let Some ( classes) = classes_locked. deref ( ) else { return & self . trie ; } ;
44+ let mut trie_builder = TrieBuilder :: new ( ) ;
45+ for class in classes. iter ( ) {
46+ trie_builder. push ( class. to_string ( ) ) ;
47+ } ;
48+ let trie = trie_builder. build ( ) ;
49+ current. replace ( trie) ;
50+ & self . trie
51+ }
52+
2653 pub fn smart_open ( server : ServerMut , path : & str , render_target : AppContainer ) {
2754 let context = FileOpenContext { path : path. to_string ( ) , start_time : Instant :: now ( ) } ;
2855 new_tokio_thread ( |runtime| async move {
@@ -74,7 +101,10 @@ impl AsmServer {
74101 }
75102
76103 let smali = accessor. read_content ( file_key) ;
77- let Some ( smali) = smali else { return ; } ;
104+ let Some ( smali) = smali else {
105+ error ! ( "content with key: `{file_key}` not found." ) ;
106+ return ;
107+ } ;
78108 let current_tab = Tab {
79109 selected : false ,
80110 file_key : Arc :: from ( file_key) ,
@@ -87,6 +117,14 @@ impl AsmServer {
87117
88118 top. file_path = Some ( file_key. to_string ( ) ) ;
89119 }
120+
121+ pub fn search ( & self , top : & mut Top ) {
122+ let Some ( query) = & top. file_path else { return ; } ;
123+ let trie_locked = self . get_trie ( ) . lock ( ) ;
124+ let Some ( trie) = trie_locked. deref ( ) else { return ; } ;
125+ let results: Vec < String > = trie. predictive_search ( query) . collect ( ) ;
126+ top. search_result = results. into_iter ( ) . map ( StrRef :: from) . collect ( ) ;
127+ }
90128}
91129
92130
0 commit comments