172 похожих чатов

Каким образом в процмакросе можно получить одну двойную кавычку? Мне нужна

инструкция вида
#myvar " abc #myvar2 " #muvar3, чтобы получилась строка с подстановкой из #myvar2.

И как можно отключить выделение строк с помощью \"\"?
Мне нужно получить $1, но quote::quote!($#num) раскрывается в $ \"2\" для строки и в $ 2usize для числа

15 ответов

17 просмотров

Ты читал, что я тебе в прошлый раз ответил?

George-C. Автор вопроса
Andrey Vlasov
Ты читал, что я тебе в прошлый раз ответил?

Да, спасибо. Я починил вывод добавив to_string(), потом вспомнил , что мне всю строку запроса надо в компайл-тайм собрать (коль есть возможность), но проблема в кавычках. Хочу подставить concatcp, чтобы он ассоциированную константу User::TABLE_NAME подставил куда надо и склеил итоговый запрос. Думаю, проблему со скобами решил с помощью proc_macro2::Group::new(что_мне_надо_окружить_скобками, pm2::Delimiter::Parenthesis), осталась проблема с кавычками (надо их поставить) и неубираемыми кавычками у строк. Мне нужно получить штуку вида User::TABLE_NAME и $1, а получается "User::TABLE_NAME"`и `$ \"1\". Пытался перегнать User::TABLE_NAME в pm2::Ident вот так: let table_name_ident = pm2::Ident::new(&format!("{}::TABLE_NAME", model.to_string()), pm2::Span::call_site()); // model: Ident, там будет название модели - User но ловлю панику и ICE: thread 'rustc' panicked at '`"User::TABLE_NAME"` is not a valid identifier', compiler\rustc_expand\src\proc_macro_server.rs:333:13

George-C. Автор вопроса
Andrey Vlasov
В идентификаторе разве бывают ::?

А как тогда? Яж не говорю, что так надо. Я спрашиваю, каясь в незнании.

George C.
Да, спасибо. Я починил вывод добавив to_string(), ...

let table_name_ident = quote!{ #model :: TABLE_NAME }; вроде тоже работает

George C.
Да, спасибо. Я починил вывод добавив to_string(), ...

репорт скинь с ICE на гитхаб, как они просят в описании ошибки

George-C. Автор вопроса
Lya
репорт скинь с ICE на гитхаб, как они просят в опи...

Прикол в том, что оно падает уже в вызывающем коде, а не при компиляции макроса. Попытаться вырезать MRE из моего кода?

George C.
Прикол в том, что оно падает уже в вызывающем коде...

Ты уверен, что именно ICE? скинь ошибку, у меня просто thread 'main' panicked at '"bobby::TABLE_NAME" is not a valid Ident

George-C. Автор вопроса
Lya
Ты уверен, что именно ICE? скинь ошибку, у меня пр...

https://gist.github.com/ShagonRU/2b04a9c90fb87d7e82e86a08db8e8533

George-C. Автор вопроса
Andrey Vlasov
let table_name_ident = quote!{ #model :: TABLE_NAM...

Я проверю как разберёмся с ICE. А что делать с нехваткой двойных кавычек? Мне нужно по одной кавычке в разные места доставить :(

George-C. Автор вопроса
Andrey Vlasov
let _: String = format!("select * from {}", quote!...

Сделал так: let table_name = quote::quote!{#model :: TABLE_NAME}; let select_from_clause = quote::quote!( "SELECT * FROM ", #table_name, ); Теперь осталась та самая проблема с кавычками. Получается { use $ crate :: shared :: helper_traits :: ChainedArguments as _ ; sqlx :: query_as_with :: < _, User, _ > (concatcp ! ("SELECT * FROM ", User :: TABLE_NAME, login = $ "2" AND email = $ "3"), sqlx :: postgres :: PgArguments :: default() . add_c(login) . add_c(email_var),) . fetch_optional(& mut executor) . await } нужна кавычка перед login и после $ "3", а ещё вот эти паразитные кавычки остались от преобразования числа в строку. UPD: с "паразитными" кавычками разобрался, дурак, надо было pm2::Literal::usize_unsuffixed(p.2) юзать, а не к строке приводить.

George C.
Сделал так: let table_name = quote::quote!{#model ...

Оно просто клеит строки или делает это с проверкой того, что ты клеишь? Так то ты sqli собираешь без этого

George-C. Автор вопроса
Lya
Оно просто клеит строки или делает это с проверкой...

Я не проверяю, в моём крейте везде импортированы нужные штуки, по крайней мере процмакрос строится на таком предположении :)

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта