Thanks to all for the clues; I'm an old-time c/c++ programmer, but must have slept through the 'lambda function' class ;-).
To help my somewhat calcified brain, is it functionally equivalent (if more clunky) to write the above snippet as shown below with the handler functions 'unchained'?
ArduinoOTA.onStart
([]() //lambda function
{
String type;
if (ArduinoOTA.getCommand() == U_FLASH)
type = "sketch";
else // U_SPIFFS
type = "filesystem";
// NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
Serial.println("Start updating " + type);
}
);
ArduinoOTA.onEnd
([]() //lambda function
{
Serial.println("\nEnd");
}
);
ArduinoOTA.onProgress
([](unsigned int progress, unsigned int total) //lambda func with arguments
{
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
}
);
ArduinoOTA.onError
([](ota_error_t error) //lambda func with arguments
{
Serial.printf("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
else if (error == OTA_END_ERROR) Serial.println("End Failed");
}
);
TIA,
Frank