diff --git a/esphome/components/api/api_connection.cpp b/esphome/components/api/api_connection.cpp index 321257e9e2..1c002f82da 100644 --- a/esphome/components/api/api_connection.cpp +++ b/esphome/components/api/api_connection.cpp @@ -1414,15 +1414,15 @@ void APIConnection::on_water_heater_command_request(const WaterHeaterCommandRequ #endif #ifdef USE_EVENT -void APIConnection::send_event(event::Event *event, std::string_view event_type) { - // MessageCreator stores const char* - data() is safe as event types are null-terminated from codegen - this->send_message_smart_(event, MessageCreator(event_type.data()), EventResponse::MESSAGE_TYPE, +void APIConnection::send_event(event::Event *event, StringRef event_type) { + // get_last_event_type() returns StringRef pointing to null-terminated string literals from codegen + this->send_message_smart_(event, MessageCreator(event_type.c_str()), EventResponse::MESSAGE_TYPE, EventResponse::ESTIMATED_SIZE); } -uint16_t APIConnection::try_send_event_response(event::Event *event, std::string_view event_type, APIConnection *conn, +uint16_t APIConnection::try_send_event_response(event::Event *event, StringRef event_type, APIConnection *conn, uint32_t remaining_size, bool is_single) { EventResponse resp; - resp.event_type = StringRef(event_type.data(), event_type.size()); + resp.event_type = event_type; return fill_and_encode_entity_state(event, resp, EventResponse::MESSAGE_TYPE, conn, remaining_size, is_single); } diff --git a/esphome/components/api/api_connection.h b/esphome/components/api/api_connection.h index 03cb787002..0289b3d2ff 100644 --- a/esphome/components/api/api_connection.h +++ b/esphome/components/api/api_connection.h @@ -173,7 +173,7 @@ class APIConnection final : public APIServerConnection { #endif #ifdef USE_EVENT - void send_event(event::Event *event, std::string_view event_type); + void send_event(event::Event *event, StringRef event_type); #endif #ifdef USE_UPDATE @@ -469,7 +469,7 @@ class APIConnection final : public APIServerConnection { bool is_single); #endif #ifdef USE_EVENT - static uint16_t try_send_event_response(event::Event *event, std::string_view event_type, APIConnection *conn, + static uint16_t try_send_event_response(event::Event *event, StringRef event_type, APIConnection *conn, uint32_t remaining_size, bool is_single); static uint16_t try_send_event_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size, bool is_single); #endif diff --git a/esphome/components/event/event.h b/esphome/components/event/event.h index a8f0b872a3..27700e32d8 100644 --- a/esphome/components/event/event.h +++ b/esphome/components/event/event.h @@ -2,12 +2,12 @@ #include #include -#include #include #include "esphome/core/component.h" #include "esphome/core/entity_base.h" #include "esphome/core/helpers.h" +#include "esphome/core/string_ref.h" namespace esphome { namespace event { @@ -45,10 +45,8 @@ class Event : public EntityBase, public EntityBase_DeviceClass { /// Return the event types supported by this event. const FixedVector &get_event_types() const { return this->types_; } - /// Return the last triggered event type, or empty string_view if no event triggered yet. - std::string_view get_last_event_type() const { - return this->last_event_type_ != nullptr ? std::string_view(this->last_event_type_) : std::string_view(); - } + /// Return the last triggered event type, or empty StringRef if no event triggered yet. + StringRef get_last_event_type() const { return StringRef::from_maybe_nullptr(this->last_event_type_); } /// Check if an event has been triggered. bool has_event() const { return this->last_event_type_ != nullptr; } diff --git a/esphome/components/prometheus/prometheus_handler.cpp b/esphome/components/prometheus/prometheus_handler.cpp index 81bbcb423c..c6f5751420 100644 --- a/esphome/components/prometheus/prometheus_handler.cpp +++ b/esphome/components/prometheus/prometheus_handler.cpp @@ -618,8 +618,8 @@ void PrometheusHandler::event_row_(AsyncResponseStream *stream, event::Event *ob stream->print(ESPHOME_F("\",name=\"")); stream->print(relabel_name_(obj).c_str()); stream->print(ESPHOME_F("\",last_event_type=\"")); - // get_last_event_type() returns string_view; data() is safe as event types are null-terminated - stream->print(obj->get_last_event_type().data()); + // get_last_event_type() returns StringRef pointing to null-terminated string literals from codegen + stream->print(obj->get_last_event_type().c_str()); stream->print(ESPHOME_F("\"} ")); stream->print(ESPHOME_F("1.0")); stream->print(ESPHOME_F("\n")); diff --git a/tests/components/event/common.yaml b/tests/components/event/common.yaml index 26caabac5c..555d049c70 100644 --- a/tests/components/event/common.yaml +++ b/tests/components/event/common.yaml @@ -8,13 +8,13 @@ event: on_event: - logger.log: Event fired - lambda: |- - // Test get_last_event_type() returns std::string_view + // Test get_last_event_type() returns StringRef if (id(some_event).has_event()) { auto event_type = id(some_event).get_last_event_type(); // Compare with string literal using == if (event_type == "template_event_type1") { ESP_LOGD("test", "Event type is template_event_type1"); } - // Log using %.*s format for string_view - ESP_LOGD("test", "Event type: %.*s", (int) event_type.size(), event_type.data()); + // Log using %.*s format for StringRef + ESP_LOGD("test", "Event type: %.*s", (int) event_type.size(), event_type.c_str()); }