1+ use iroha_client:: client:: Client ;
2+ use std:: num:: NonZeroU64 ;
3+
4+ fn main ( ) -> Result < ( ) , Box < dyn Error > > {
5+ let config = get_config ( get_config_path ( ) ?) ;
6+ let iroha_client: Client = Client :: new ( & config) ?;
7+
8+ initiate_block_listener ( & iroha_client, 1 ) ?;
9+
10+ Ok ( ( ) )
11+ }
12+ /// Auxiliary method for a block listener
13+ /// You shall implement it first
14+ fn non_zero_handler ( number : u64 ) -> NonZeroU64 {
15+ NonZeroU64 :: new ( number) . map_or_else (
16+ || {
17+ println ! ( "The number must be > 0, using default value 1" ) ;
18+ NonZeroU64 :: new ( 1 ) . unwrap ( )
19+ } ,
20+ |non_zero| non_zero,
21+ )
22+ }
23+ /// A block listener configuration
24+ /// iroha_client - Your iroha client implementation
25+ /// initial_block_number - The number of a block listener should start from.
26+ /// To get total quantity of blocks, you may use method iroha_client.get_status().
27+ fn initiate_block_listener (
28+ iroha_client : & Client ,
29+ initial_block_number : u64 ,
30+ ) -> Result < ( ) , Box < dyn Error > > {
31+ // Processing the non zero value from the u64
32+ let block_number = non_zero_handler ( initial_block_number) ;
33+ // Initiating the block listener object
34+ let block_iter = iroha_client. listen_for_blocks ( block_number) ?;
35+ // Initiating iteration by blocks. The iterator is infinite
36+ for block in block_iter {
37+ match & block {
38+ Ok ( block) => println ! ( "Received block: {block:?}" ) ,
39+ Err ( e) => println ! ( "Error happened: {}" , e) ,
40+ }
41+ }
42+ Ok ( ( ) )
43+ }
44+ use iroha_config:: client:: Configuration ;
45+ use std:: env;
46+ use std:: error:: Error ;
47+ use std:: fs:: File ;
48+ use std:: path:: { Path , PathBuf } ;
49+
50+ pub fn get_config_path ( ) -> Result < PathBuf , Box < dyn Error > > {
51+ let exe_path = env:: current_exe ( ) ;
52+ let binding = exe_path?;
53+ let ancestors = binding. ancestors ( ) ;
54+ for ancestor in ancestors {
55+ if ancestor. file_name ( ) == Some ( "target" . as_ref ( ) ) {
56+ let source_path = Path :: new ( ancestor) ;
57+ let mut config_path = PathBuf :: from ( source_path. parent ( ) . unwrap ( ) ) ;
58+ config_path. push ( "src" ) ;
59+ config_path. push ( "resources" ) ;
60+ config_path. push ( "config.json" ) ;
61+ return Ok ( config_path) ;
62+ }
63+ }
64+ Err ( "The source directory was not found in the ancestor path." . into ( ) )
65+ }
66+ pub fn get_config ( path_buf : PathBuf ) -> Configuration {
67+ let file =
68+ File :: open ( & path_buf) . unwrap_or_else ( |_| panic ! ( "Failed to read file at: {path_buf:?}" ) ) ;
69+ serde_json:: from_reader ( file) . unwrap_or_else ( |_| panic ! ( "Failed to read config at ?????" ) )
70+ }
0 commit comments