@@ -11,7 +11,9 @@ use std::sync::{Arc, Mutex};
1111use std:: time:: Duration ;
1212
1313use chrono:: { DateTime , Utc } ;
14+ use futures:: TryStreamExt ;
1415use kamu:: domain:: * ;
16+ use kamu:: utils:: datasets_filtering:: filter_datasets_by_any_pattern;
1517use opendatafabric:: * ;
1618
1719use super :: { BatchError , CLIError , Command } ;
@@ -24,8 +26,9 @@ use crate::output::OutputConfig;
2426pub struct PullCommand {
2527 pull_svc : Arc < dyn PullService > ,
2628 dataset_repo : Arc < dyn DatasetRepository > ,
29+ search_svc : Arc < dyn SearchService > ,
2730 output_config : Arc < OutputConfig > ,
28- refs : Vec < DatasetRefAny > ,
31+ refs : Vec < DatasetRefAnyPattern > ,
2932 all : bool ,
3033 recursive : bool ,
3134 fetch_uncacheable : bool ,
@@ -38,6 +41,7 @@ impl PullCommand {
3841 pub fn new < I > (
3942 pull_svc : Arc < dyn PullService > ,
4043 dataset_repo : Arc < dyn DatasetRepository > ,
44+ search_svc : Arc < dyn SearchService > ,
4145 output_config : Arc < OutputConfig > ,
4246 refs : I ,
4347 all : bool ,
@@ -48,11 +52,12 @@ impl PullCommand {
4852 force : bool ,
4953 ) -> Self
5054 where
51- I : IntoIterator < Item = DatasetRefAny > ,
55+ I : IntoIterator < Item = DatasetRefAnyPattern > ,
5256 {
5357 Self {
5458 pull_svc,
5559 dataset_repo,
60+ search_svc,
5661 output_config,
5762 refs : refs. into_iter ( ) . collect ( ) ,
5863 all,
@@ -69,9 +74,16 @@ impl PullCommand {
6974 listener : Option < Arc < dyn PullMultiListener > > ,
7075 ) -> Result < Vec < PullResponse > , CLIError > {
7176 let local_name = self . as_name . as_ref ( ) . unwrap ( ) ;
72- let remote_ref = self . refs [ 0 ] . as_remote_ref ( |_| true ) . map_err ( |_| {
73- CLIError :: usage_error ( "When using --as reference should point to a remote dataset" )
74- } ) ?;
77+ let remote_ref = match self . refs [ 0 ] . as_dataset_ref_any ( ) {
78+ Some ( dataset_ref_any) => dataset_ref_any. as_remote_ref ( |_| true ) . map_err ( |_| {
79+ CLIError :: usage_error ( "When using --as reference should point to a remote dataset" )
80+ } ) ?,
81+ None => {
82+ return Err ( CLIError :: usage_error (
83+ "When using --as reference should not point to wildcard pattern" ,
84+ ) )
85+ }
86+ } ;
7587
7688 Ok ( self
7789 . pull_svc
@@ -93,10 +105,18 @@ impl PullCommand {
93105 & self ,
94106 listener : Option < Arc < dyn PullMultiListener > > ,
95107 ) -> Result < Vec < PullResponse > , CLIError > {
108+ let dataset_refs: Vec < _ > = filter_datasets_by_any_pattern (
109+ self . dataset_repo . as_ref ( ) ,
110+ self . search_svc . clone ( ) ,
111+ self . refs . clone ( ) ,
112+ )
113+ . try_collect ( )
114+ . await ?;
115+
96116 Ok ( self
97117 . pull_svc
98118 . pull_multi (
99- self . refs . clone ( ) ,
119+ dataset_refs ,
100120 PullMultiOptions {
101121 recursive : self . recursive ,
102122 all : self . all ,
0 commit comments