Skip to content

Commit 35c6078

Browse files
committed
Member deletion is here
1 parent 9f7191e commit 35c6078

File tree

1 file changed

+33
-10
lines changed

1 file changed

+33
-10
lines changed

examples/arioso/arioso.cpp

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)