// déclaration de la structure qui contient un menu et ses sous menus
struct MenuItem {
  const char *nom;
  void (*action)();
  size_t numSubmenu;  // <== on a besoin du compte pour parcourir le tableau du sous menu
  MenuItem *submenu;

  void print() {
    Serial.print(nom);
    if (action != nullptr) {
      Serial.print(F(" -> ")); action();
    }
    Serial.println();
    for (size_t i = 0; i < numSubmenu; i++) {
      Serial.write('\t'); submenu[i].print();
    }
  }
};

// déclaration des callbacks (en avance car besoin dans la définition du menu)
void fadimAction();
void aboubacarAction();
void aichaAction();
void mariamAction();
void mansourAction();

// définition des sous menus
MenuItem mohamedSubMenu[] = {
  {"FADIM",       fadimAction,      0, nullptr},
  {"KARIMA",      nullptr,          0, nullptr},
  {"FATOUMA",     nullptr,          0, nullptr},
  {"BAFODE",      nullptr,          0, nullptr},
};
const size_t numMohamedSubMenu = sizeof mohamedSubMenu / sizeof * mohamedSubMenu;

MenuItem alhousseinSubMenu[] = {
  {"ABOUBACAR",   aboubacarAction,  0, nullptr},
  {"BINTOU",      nullptr,          0, nullptr},
  {"IBRAHIM",     nullptr,          0, nullptr},
};
const size_t numAlhousseinSubMenu = sizeof alhousseinSubMenu / sizeof * alhousseinSubMenu;

MenuItem amineSubMenu[] = {
  {"AICHA",       aichaAction,      0, nullptr},
  {"MOUSSA",      nullptr,          0, nullptr},
  {"YAHYA",       nullptr,          0, nullptr},
  {"YOUSSOUF",    nullptr,          0, nullptr},
};
const size_t numAmineSubMenu = sizeof amineSubMenu / sizeof * amineSubMenu;

MenuItem abdoulahSubMenu[] = {
  {"MARIAM",      mariamAction,      0, nullptr},
  {"DALOBA",      nullptr,           0, nullptr},
};
const size_t numAbdoulahSubMenu = sizeof abdoulahSubMenu / sizeof * abdoulahSubMenu;

MenuItem mouctarSubMenu[] = {
  {"MANSOUR",     mansourAction,      0, nullptr},
  {"BOBO" ,       nullptr,            0, nullptr},
  {"SIDIKI",      nullptr,            0, nullptr},
};
const size_t numMouctarSubMenu = sizeof mouctarSubMenu / sizeof * mouctarSubMenu;

// définition du menu principal
MenuItem menu[] = {
  {"MOHAMED",     nullptr, numMohamedSubMenu,    mohamedSubMenu},
  {"ALHOUSSEIN",  nullptr, numAlhousseinSubMenu, alhousseinSubMenu},
  {"AMINE",       nullptr, numAmineSubMenu,      amineSubMenu},
  {"ABDOULAH",    nullptr, numAbdoulahSubMenu,   abdoulahSubMenu},
  {"MOUCTAR",     nullptr, numMouctarSubMenu,    mouctarSubMenu},
};
size_t numMenuItems = sizeof menu  / sizeof * menu;

// définition des callbacks
void fadimAction() {
  Serial.print(F("Fadim Action"));
}
void aboubacarAction() {
  Serial.print(F("Aboubacar Action"));
}
void aichaAction() {
  Serial.print(F("Aicha Action"));
}
void mariamAction() {
  Serial.print(F("Mariam Action"));
}
void mansourAction() {
  Serial.print(F("Mansour Action"));
}

// --------------
void setup() {
  Serial.begin(115200); Serial.println();
  for (auto & m : menu) {
    Serial.println(F("--------"));
    m.print();
  }
}

void loop() {}