Конфликт времени жизни в замыкании. Почему?

Здравствуйте.
Есть вот такой код:

...

impl<'a, M> Parser<'a> for ElementsSet<'a, M>
where
    M: Fn(&'a str) -> String,
{
    fn parse(&self, in_string: &'a str) -> (Result<String, ()>, &'a str) {
        let res = self.parser.parse(in_string);
        return if let Ok(r) = res.0 {
            (Ok((self.mapper)(&r)), res.1)
        } else {
            res
        };
    }
}

...

impl<'a> Parser<'a> for ElementAny {
    fn parse(&self, in_string: &'a str) -> (Result<String, ()>, &'a str) {
        let mut parser = And::new();

        parser.add_parser(BoxedParser::new(ElementOpen::new()));
        parser.add_parser(BoxedParser::new(ZeroOrMore::new(ElementsSet::new(
            |parsed: &str| {
                let ident = " ".repeat(self.level * 4);
                ident
            },
            self.level + 1,
        ))));
        parser.add_parser(BoxedParser::new(ElementClose::new()));

        return parser.parse(in_string);
    }
}

Компилятор ругается так:

error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements
   --> src/xml_formater.rs:453:13
    |
453 | /             |parsed: &str| {
454 | |                 let ident = " ".repeat(self.level * 4);
455 | |                 ident
456 | |             },
    | |_____________^
    |
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 448:5...
   --> src/xml_formater.rs:448:5
    |
448 | /     fn parse(&self, in_string: &'a str) -> (Result<String, ()>, &'a str) {
449 | |         let mut parser = And::new();
450 | |
451 | |         parser.add_parser(BoxedParser::new(ElementOpen::new()));
...   |
461 | |         return parser.parse(in_string);
462 | |     }
    | |_____^
    = note: ...so that the types are compatible:
            expected &&xml_formater::ElementAny
               found &&xml_formater::ElementAny
note: but, the lifetime must be valid for the lifetime `'a` as defined on the impl at 447:6...
   --> src/xml_formater.rs:447:6
    |
447 | impl<'a> Parser<'a> for ElementAny {
    |      ^^
    = note: ...so that the expression is assignable:
            expected (std::result::Result<std::string::String, ()>, &'a str)
               found (std::result::Result<std::string::String, ()>, &str)

Насколько я понимаю, его не удовлетворяет время жизни переменной ident. С одной стороны, оно не должно выходить за пределы метода parse, с другой - должно удовлетворять времени жизни 'a.

А с чего он это взял? ident - вообще независимая переменная, возвращается её не ссылка, а владение. Т.е. вообще никаких нестыковок не вижу. С parsed тоже вроде всё в порядке - это часть самой исходной строки, она существует на всё время работы парсера.

Объясните, что не так?

Кажется, причина в самом замыкании

|parsed| {
                let ident = " ".repeat(self.level * 4).to_string();
                ident
            }

А именно - в использовании поля self.level. Но всё ещё не могу понять - почему?

А как выглядят остальные определения, в том числе ElementsSet?

А с чего он это взял?

C той сигнатуры, которую Вы ему скормили:

fn parse(&self, in_string: &'a str) -> (Result<String, ()>, &'a str) {

А именно - в использовании поля self.level. Но всё ещё не могу понять - почему?

Ну, self.level закреплен за тем же лайтайм-параметром, что и self (он ведь его часть). Само замыкание у Вас захватывает ссылку на self.level (это Fn замыкание), соотвественно является объектом, который ссылается на self.level, а значит не может пережить self. При этом это замыкание уезжает в parser, а результат parser.parse() должен не пережить некий лайфтайм 'a, с которым self у Вас никак не связан.

Вам надо пошаманить над сигнатуркой,

По идее, что-то типа этого должно сработать:

fn parse<'s, 'r: 's + 'a>(&'s self, in_string: &'a str) -> (Result<String, ()>, &'r str) {

Либо же избавиться в замыкании ссылки на self.level скопировав/склонировав значение и смувнув его в move || замыкание, тогда зависимости от self лайфтайма не будет.

А как выглядят остальные определения, в том числе ElementsSet ?

Вот так. Это не весь модуль, там ещё много чего. Только связанные с ошибкой.

Да, но при чём тут само замыкание? Результат - да. Это просто ссылка на часть входящей строки. А второй результат - вообще значение. Но само по себе замыкание и не будет жить дольше функции parse. Не пойму, на чём компилятор спотыкается.

Мне кажется, что проблема может быть в неправильной реализации And или Or, но я не видел их, потому не могу точно сказать. Что-нибудь в стиле impl<'a> Parser<'a> for Or<'a>, по идее, может сцепить лайфтаймы данных и парсера, вызвав подобную ошибку.
Кстати, именно из-за возможности таких ошибок я обычно использую хотя бы чуть-чуть говорящие названия лайфтаймов - хотя бы на уровне 'i для входных данных, 'p для парсера, 's для состояния.

Спасибо за подсказку. Поищу.
Могу, в общем-то, выложить и весь модуль, если есть желание в нём ковыряться )

Решил, но так и не понял как именно )
Просто начал заново расставлять все времена жизни в каждой структуре и характеристике.
Всем спасибо!