#include #include #include #define YAML_IMPLEMENTATION #include "../include/cyaml.h" // Define a simple User struct. typedef struct { int id; char name[100]; char email[100]; } User; #define MAX_USERS 100 User users[MAX_USERS]; size_t user_count = 0; // Display the list of users. void list_users(void) { printf("\n-- User Database --\n"); if (user_count == 0) { printf("No users found.\n"); return; } for (size_t i = 0; i < user_count; i++) { printf("ID %d: %s, %s\n", users[i].id, users[i].name, users[i].email); } } // Save the in-memory user database to a YAML file. // The output YAML file will have a mapping with the key "users" // which contains a sequence of mappings (each representing a user). int save_to_file(const char *filename) { // Create a new document with a mapping as root. YAMLDoc *doc = (YAMLDoc*)malloc(sizeof(YAMLDoc)); if (!doc) return -1; doc->root = yaml_new_map(); if (!doc->root) { free(doc); return -1; } // Create a sequence to hold all user mappings. YAMLNode *userSeq = yaml_new_seq(); if (!userSeq) { yaml_doc_destroy(doc); return -1; } // For each user, create a mapping and add it to the sequence. for (size_t i = 0; i < user_count; i++) { YAMLNode *userMap = yaml_new_map(); char idStr[20]; snprintf(idStr, sizeof(idStr), "%d", users[i].id); yaml_map_set(userMap, "id", yaml_new_str(idStr)); yaml_map_set(userMap, "name", yaml_new_str(users[i].name)); yaml_map_set(userMap, "email", yaml_new_str(users[i].email)); yaml_seq_append(userSeq, userMap); } yaml_map_set(doc->root, "users", userSeq); // Create an emitter and write the document to the file. YAMLEmitter *emitter = yaml_emitter_create(); if (!emitter) { yaml_doc_destroy(doc); return -1; } if (yaml_emit(emitter, doc) != 0) { yaml_emitter_destroy(emitter); yaml_doc_destroy(doc); return -1; } int ret = yaml_emit_to_file(emitter, filename); // Clean up. yaml_emitter_destroy(emitter); yaml_doc_destroy(doc); return ret; } // Add a new user via CLI. void add_user(void) { if (user_count >= MAX_USERS) { printf("User database is full.\n"); return; } User newUser; newUser.id = user_count + 1; // Simple sequential id assignment. printf("Enter user name: "); if (!fgets(newUser.name, sizeof(newUser.name), stdin)) { printf("Error reading name.\n"); return; } newUser.name[strcspn(newUser.name, "\n")] = '\0'; // Remove newline. printf("Enter user email: "); if (!fgets(newUser.email, sizeof(newUser.email), stdin)) { printf("Error reading email.\n"); return; } newUser.email[strcspn(newUser.email, "\n")] = '\0'; users[user_count++] = newUser; printf("User added successfully.\n"); } // Edit an existing user via CLI. void edit_user(void) { list_users(); printf("Enter the user ID to edit: "); int id; if (scanf("%d", &id) != 1) { printf("Invalid input.\n"); while(getchar() != '\n'); // Flush input buffer. return; } while(getchar() != '\n'); // Consume newline. int found = 0; for (size_t i = 0; i < user_count; i++) { if (users[i].id == id) { found = 1; printf("Editing user (ID %d): %s, %s\n", users[i].id, users[i].name, users[i].email); printf("Enter new name (leave empty to keep unchanged): "); char newName[100]; if (fgets(newName, sizeof(newName), stdin)) { newName[strcspn(newName, "\n")] = '\0'; if (strlen(newName) > 0) strncpy(users[i].name, newName, sizeof(users[i].name)); } printf("Enter new email (leave empty to keep unchanged): "); char newEmail[100]; if (fgets(newEmail, sizeof(newEmail), stdin)) { newEmail[strcspn(newEmail, "\n")] = '\0'; if (strlen(newEmail) > 0) strncpy(users[i].email, newEmail, sizeof(users[i].email)); } printf("User updated successfully.\n"); break; } } if (!found) printf("User with ID %d not found.\n", id); } int main(void) { int running = 1; while (running) { printf("\n--- User Database CLI ---\n"); printf("1. List users\n"); printf("2. Add user\n"); printf("3. Edit user\n"); printf("4. Save database to file\n"); printf("5. Exit\n"); printf("Enter choice: "); int choice; if (scanf("%d", &choice) != 1) { printf("Invalid input. Please enter a number.\n"); while(getchar() != '\n'); // Clear the invalid input. continue; } while(getchar() != '\n'); // Consume newline. switch (choice) { case 1: list_users(); break; case 2: add_user(); break; case 3: edit_user(); break; case 4: { char filename[256]; printf("Enter filename to save the database: "); if (fgets(filename, sizeof(filename), stdin)) { filename[strcspn(filename, "\n")] = '\0'; if (save_to_file(filename) == 0) printf("Database saved successfully to '%s'.\n", filename); else printf("Error saving database to '%s'.\n", filename); } break; } case 5: running = 0; break; default: printf("Invalid choice. Please try again.\n"); } } return 0; }