@@ -60,15 +60,15 @@ ario::Result extract_member( const ario::Member& member )
6060 // For demonstration purposes, we will just print the member name and size
6161 std::cout << " Extracting member: " << member << " , Size: " << member.size
6262 << " bytes" << std::endl;
63+
6364 std::filesystem::path output_path =
6465 std::filesystem::current_path () / member.name ;
6566 std::ofstream output_file ( output_path, std::ios::binary );
6667 if ( !output_file ) {
67- std::cerr << " Failed to create output file: " << output_path
68- << std::endl;
69- return {};
68+ return { " Failed to create output file : " + output_path.string () };
7069 }
7170 output_file.write ( member.data ().c_str (), member.size );
71+
7272 return {}; // Return success
7373}
7474
@@ -77,23 +77,46 @@ int main( int argc, char** argv )
7777 auto opts = parse_args ( argc, argv );
7878
7979 // Open existing library or create a new one. In the last case, the library will be empty.
80- ario lib ;
81- lib .load ( opts.archive_name );
80+ ario archive ;
81+ archive .load ( opts.archive_name );
8282
83- // List all members from the command line extraction list and extract them .
83+ // Extract all members from the command line extraction list.
8484 // The search should be done by member's name. Exact match is expected
8585 for ( const auto & file_name : opts.extract_files ) {
8686 const auto & pmember =
87- std::find ( lib.members .begin (), lib.members .end (), file_name );
88- if ( pmember != lib.members .end () ) {
89- extract_member ( *pmember );
87+ std::find ( archive.members .begin (), archive.members .end (), file_name );
88+ if ( pmember != archive.members .end () ) {
89+ auto result = extract_member ( *pmember );
90+ if ( !result.ok () ) {
91+ std::cerr << " Error extracting member '" << file_name
92+ << " ': " << result.what () << std::endl;
93+ }
9094 }
9195 else {
92- std::cout << " Member '" << file_name << " ' not found in the library"
96+ std::cerr << " Member '" << file_name << " ' not found in the library"
9397 << std::endl;
9498 return 1 ;
9599 }
96100 }
97101
102+ if (opts.delete_files .empty () && opts.add_files .empty ()) {
103+ // No files to delete or add. Exiting
104+ return 0 ;
105+ }
106+
107+ ario target_archive;
108+
109+ // Delete members from the command line deletion list.
110+ for ( const auto & member : archive.members ) {
111+ if ( std::find ( opts.delete_files .begin (), opts.delete_files .end (),
112+ member.name ) == opts.delete_files .end () ) {
113+ std::optional<std::reference_wrapper<const ario::Member>>
114+ added_member = std::nullopt ;
115+ target_archive.add_member ( member, member.data (), added_member );
116+ }
117+ }
118+
119+ target_archive.save ( opts.archive_name );
120+
98121 return 0 ;
99122}
0 commit comments